Einzelnen Beitrag anzeigen

Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: PNG und Canvas via BMP und anderes

  Alt 15. Apr 2024, 09:34
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.)
Michael Gasser

Geändert von Michael II (15. Apr 2024 um 09:54 Uhr)
  Mit Zitat antworten Zitat