Witam.
Potrzebuję pomocy z kopiowaniem fragmentu obrazu w formacie PNG zachowując przezroczystość - czyli konwertowanie do BMP odpada(?). Potrzebowałbym coś na wzór CopyRect - ten niestety działa tylko z BMP.
Wcześniej się głowiłem jak skopiować/wymalować cały element zachowując przezroczystość. Udało mi się w taki sposób:
buba:=TCanvas.Create;
aa:=TImage.Create(Self);
aa.Width:=275;
aa.Height:=25;
aa.Picture.LoadFromFile('plansza1.bmp');
aa.Enabled:=True;
(...)
workdc:=CreateCompatibleDC(Form1.Canvas.Handle);
bmp:=CreateCompatibleBitmap(Form1.Canvas.Handle, ClientWidth, ClientHeight);
SelectObject(workdc,bmp);
SelectPalette(workdc,Image1.Picture.Bitmap.Palette,false); //Image1 zawiera obrazek BMP
buba.Handle:=workdc;
buba.CopyRect(rect(0,0,275,25),aa.Canvas,aa.Canvas.ClipRect); //aa zawiera to samo, co Image1
//przemalowanie PNG
buba.Draw(0,12,Image3.Picture.Graphic); //Image3 zawiera PNG
(...)
RealizePalette(buba.Handle);
Form1.Canvas.CopyRect(Form1.Canvas.ClipRect,buba,buba.ClipRect);
PNG - plansza111.png:
BMP (imageshack przekonwertował na png) - plansza1.bmp:
Za pomocą Draw mogłem wyrysować cały PNG zachowując też przezroczystość. I wygląda to mniej więcej tak:
(wymalowany obrazek PNG nachodzący na obrazek BMP)
Zależy mi na tym by móc wyrysowywać fragment tego obrazka. Potrzebne mi to jest do podwójnego buforowania, gdzie na danej planszy (tło) domalowywałbym odpowiedni fragment tak by nie zamalowywać niepotrzebnej części, a zaraz po tym wyświetlić gotowy obrazek na ekran unikając migotania. Obrazek z efektem jaki chciałbym osiągnąć (lewy) i złym efektem (prawy):
i po to mi jest potrzebna ta przezroczystość
Czyli generalnie przykładowo potrzebuję wyrysowywać kratkę (25x25) o współrzędnych rect(175,0,200,25).
Konwersja do BMP powoduje, iż w miejscach gdzie była przezroczystość pojawia się biały(?) kolor, ale nawet gdy włączyłem transparent na clWhite wszystko inne białe stało się przezroczyste, a to nie.
Byłem zmuszony użyć podwójnego buforowania, bo używałem 2 komponentów TImage, gdzie jeden był tłem, zaś drugi zawierał elementy ruchome (ludzik, skrzynki). Ustawiony miałem fiolet jako kolor przezroczystości stąd BMP ma fioletowe fragmenty i na tym górnym komponencie wyrysowywałem ruch/animacje, ale powodowało to miganie tego obrazka (skrzynek i ludzika).
Używam Delphi 7 i PNG Delphi version 1.56.
Proszę o jakieś sugestie i w miarę możliwości przykłady.