Delphi-Quellcode:
procedure PngToBmp32( p : TPngImage; b : TBitMap );
begin
b.PixelFormat := pf32Bit;
b.AlphaFormat := afDefined;
b.Assign(p);
end;
...ist etwas einfacher und du hast dadurch auch eine ARGB Bitmap.
Probleme gibt's halt bei 32 Bit in
VCL (wie bereits früher hier beschrieben) bei der
Bearbeitung der Bitmap via
VCL Grafikmethoden wie copyrect, rectangle etc., weil Delphi
VCL in diesem Bereich im letzten Jahrtausend stehen geblieben ist.
Wenn du zum Beispiel eine ARGB Bitmap via
VCL canvas.savetofile() speicherst, dann ruft Delphi TBitmap.WriteStream für (FImage.FDIB.dsBMIh.biBitCount = 32) and (FAlphaFormat = afDefined) die Prozedur UnPreMultiplyAlpha auf. U.a. wegen solchem Code (Aufrufe von UnPreMultiplyAlpha oder PreMultiplyAlpha zu Unzeiten) entstehen die falschen Farben, welche in #1 beschrieben werden.
Deshalb:
Bei einfacheren Problemen (wie copyrect Funktionalität für ARGB BitMap) kann man via
BitBlt,
AlphaBlend,
TransparentBlt viel tun.
(graphics32 und FMX sind unnötig für einfache Kopierfunktionen von rechteckigen ARGB Bereichen.)
Wenn du komplexere Dinge anzeigen willst (zum Beispiel Bewegung, Alphakanal Malfarbe), dann würde ich dafür Windows Graphics32 verwenden (extrem performant) und wenn's nicht nur Windows sein muss FMX (Beispiel siehe #12). Ich weiss nicht wie gut FMX heute ist. In den Anfängen waren viele Dinge sehr umständlich programmiert. Aber heutige Prozessoren fressen solche Probleme ja durch Power und mit Energieverschwendung weg.
Wenn du deine App in Massen via Web verteilst ist bei der Wahl graphics32, FMX etc. eventuell auch die Grösse der .exe ein Faktor.
WICImage wurde hier erwähnt. Ich sehe nicht, wie dies beim
Bearbeiten von ARGB Bildern helfen kann. Fürs Laden und Speichern ist es aber echt cool.
Weiss hier jemand wie man mit Delphis
VCL TWICImage eine ARGB Bitmap als .BMP speichern kann (Bitmap als .PNG speichern funktioniert problemlos und ist sicher in den allermeisten Fällen eh sinnvoller)? Damit der korrekte ARGB BMP Header geschrieben wird müsste man für .BMP via IWICBitmapFrameEncode, IPropertyBag2 EnableV5Header32bppBGRA=1 setzen - wenn jemand Code hat, dann gern
.
(Mich interessiert hier nur TWICImage; dass es durch
direktes Schreiben des BMP Headers gut geht, weiss ich.)