Okay, ich habe noch ein wenig weiter probiert:
Beim Auslesen der Header-Daten ist mir aufgefallen, dass ich folgende PNGs im Testset habe:
PNG 1: RGBA (Mode 6) ; 8bit/ch -> 32bit/px ; Transparenz-Modus: Partial (Nur Binärer Alpha-Channel)
PNG 2:
RGB (Mode 2) ; 8bit/ch -> 24bit/px ; Transparenz-Modus: None
PNG 3: Palette (Mode 3) ; 8bit/ch -> 8bit/px ; Transparenz-Modus: None
PNG 4: Palette (Mode 3) ; 8bit/ch -> 8bit/px ; Transparenz-Modus: Bit
PNG 5: Palette (Mode 3) ; 4bit/ch -> 4bit/px ; Transparenz-Modus: None
Zur Darstellung habe ich einige Codeschnipsel gebastelt:
Code 1:
Delphi-Quellcode:
Image.Picture.LoadFromStream(AStream);
Code 2:
Delphi-Quellcode:
png := TPNGImage.Create;
png.LoadFromStream(AStream);
Image.Picture.Graphic := png;
Code 3:
Delphi-Quellcode:
png := TPNGImage.Create;
png.LoadFromStream(AStream);
bmp := TBitmap.Create;
bmp.Assign(png);
Image.Picture.Graphic := bmp;
Code 4:
Delphi-Quellcode:
png := TPNGImage.Create;
png.LoadFromStream(AStream);
bmp := TBitmap.Create;
bmp.Assign(png);
Image.Picture.Graphic := bmp;
Image.Transparent := png.TransparencyMode = ptmBit
Daraus habe ich diese Tabelle kreiert:
| Code 1 | Code 2 | Code 3 | Code 4 |
PNG 1 | Ok | Ok | Ok | Ok |
PNG 2 | Ok | Ok | Ok | Ok |
PNG 3 | Ok | Ok | Ok | Ok |
PNG 4 | Schwarze Outlines (Siehe OP) | Schwarze Outlines (Siehe OP) | Tranzparenz wird schwarz dargestellt | Ok, Leichter Bildversatz im Vergleich zu PNG<>4 |
PNG 5 | Ok | Ok | Ok | Ok |
Es wird deutlich, dass die pngimage Library von Delphi Probleme mit dem Darstellen von BitAlpha PNGs hat. Wie bereits gesagt, die Pixeldaten selbst geben beim Zugriff über
png.Pixels
aber auch
bmp.Pixels
die korrekten Farbdaten an. Deswegen ist meine Vermutung, dass im TPNGImage.Draw ein Fehler passiert, vllt in Kombination mit dem Stretch? pngimage hat einen extra AlphaBit-Case in seiner Draw-Funktion. Da hier aber hauptsächlich mit Windows-Funktionen hantiert wird, kann ich ab diesem Punkt nicht wirklich weiter ermitteln, besonders, da ich mir nicht sicher sein kann, dass dort tatsächlich der Fehler liegt.
Ich wollte mal erfahren, ob Ihr den Fehler reproduzieren könnt?