[Delphi] PNG i kopiowanie

0

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:
user image

BMP (imageshack przekonwertował na png) - plansza1.bmp:
user image

Za pomocą Draw mogłem wyrysować cały PNG zachowując też przezroczystość. I wygląda to mniej więcej tak:
user image
(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):
user image 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.

0

Moją sugestią byłoby zmienienie komponentów do PNG. Jeśli nie jest Ci potrzebne zapisywanie do PNG to przejdź na GraphicEx.

Instalacja tego jest banalnie prosta, po prostu dodajesz unit GraphicEx do sekcji uses, i automatycznie w zwyklym obiekcie TImage masz dostęp do wielu (naprawde wielu) formatów graficznych. No i możesz oczywiście kopiować sobie za pomocą CopyRect.

A najlepiej byłoby Ci przesiąść się na jakąś biblioteke stworzoną pod pisanie gier. Myślałeś o tym?
Polecam UnDelphiX albo starszą wersję Asphyre (nowa chodzi od BDS 2006).
Nie będziesz musiał kombinować z doubble bufferingiem i bawić się w kopiowanie. ;-)

Pozdrawiam

0

Sprawdziłem tego GraphicEx, ale nie działa mi w nim transparent w PNG. Przynajmniej nie działa tak jak to było w TPNGImage, gdzie po wczytaniu obrazka od razu działała przezroczystość. W GraphicEx kolor przezroczysty zamienił się na czarny, co ciekawe po sprawdzeniu czy zawiera Alpha dało true, czyli jakoś da się chyba ustawić przezroczystość?

Co do bibliotek do gier... nie mogę takowych używać - takie wymagania projektu.

sorry za błędy:P

1 użytkowników online, w tym zalogowanych: 0, gości: 1