Delphi: ImageList-ben PNG, színcsere, alpha marad

Delphi: ImageList-ben PNG, színcsere, alpha marad
2019-03-20T21:44:42+01:00
2019-03-21T10:22:23+01:00
2022-10-15T21:31:42+02:00
trob
Sziasztok!

Delphiban van egy ImageList-em (akár TImageList, akár DevExpress-es TcxImageList), benne alpha csatornát is használó PNG képek. A kép RGB része egy fekete négyzet. Az Alpha csatorna tartalmazza a formát, ami látszik a fekete négyzetből. Azt szeretném elérni, hogy a fekete négyzet színét cserélhessem futásidőben, míg az Alpha marad. Végeredményben az egyszínű kép színe cserlődne.

Próbálkoztam mindenhogyan, de nem akar menni. Próbáltam a listák propertyjeit állítgatni, és úgy kiszedni a külön képet és külön az alphát.

TImageList: itt a maskot nem szedi ki. Ha kimentem SaveToFile-la, akkor egy 0 byte-os filet ment, és a Replace-nél kivétel jön, hogy a mask nem jó méretű (0*0 px)

BMPkep := TBitmap.Create; BMPmask := TBitmap.Create; Try TImageListHack(il1).GetImages(0, BMPkep, BMPmask); BMPkep.Canvas.Brush.Color := clRed; BMPkep.Canvas.FillRect(TRect.Create(0, 0, BMPkep.Width, BMPkep.Height)); il1.Replace(i, BMPkep, BMPmask); End; Finally BMPkep.Free; BMPmask.Free; End;
TcxImageList: Itt meg az alpha által látszó részt rajzolja rá a képre, az alpha által kimaszkolt részt nem rajzolja (tehát kép+mask kerül a BMPkep-be), és a maszk pedig egy fekete négyzetként jön ki, forma helyett.

BMPkep := TBitmap.Create; BMPmask := TBitmap.Create; Try il1.GetBitmap(i, BMPkep); il1.GetMask(i, BMPmask); BMPkep.Canvas.Brush.Color := clRed; BMPkep.Canvas.FillRect(TRect.Create(0, 0, BMPkep.Width, BMPkep.Height)); il1.Replace(i, BMPkep, BMPmask); Finally BMPkep.Free; BMPmask.Free; End;

Hogy kell megcsinálni, hogy a PNG képnek az előtér színét cserélem, és a mask marad?
Mutasd a teljes hozzászólást!
A fenébe.

Kézzel kell beállíanom a mask méreteit, és akkor jól jön a maszk.

... BMPmask.Width := il1.Width; BMPmask.Height := il1.Height; TImageListHack(il1).GetImages(0, BMPimg, BMPmask); ...
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd