AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PNG in TImage falsch dargestellt

Ein Thema von tumo · begonnen am 14. Apr 2020 · letzter Beitrag vom 29. Apr 2020
Antwort Antwort
Seite 1 von 2  1 2      
Rolf Frei

Registriert seit: 19. Jun 2006
657 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: PNG in TImage falsch dargestellt

  Alt 22. Apr 2020, 11:57
Ich klinke mich mal kurz ein da ich gerade auch einen Code erstellt habe um aus einen Stream (genauer gesagt ein im Stream gespeichertes PNG) in einem TImage anzuzeigen. Das (transparente) PNG wird über LoadFromStream in ein TPNGImage geladen und anschließend in einem TImage angezeigt. Sofern ich nicht völlig blind bin klappt die Darstellung der Transparenzen problemlos... Delphi 10.3.3
Mein beschriebenes Problem ist etwas tiefgründiger, wie ich festgestellt habe. Wenn du das PNG einfach nur darstellst, passt das. Sobald du nun aber eine Bitmap daraus machst, also mit Assign, und es speicherst wird der Hintergrund nun schwarz und der Alphachannelbereich wird falsch und sieht fürchterlcih aus. Das ist mit der älteren PNGImages aus D7 nicht der Fall. Da ist der Hintergrund nach dem Speichern weiss und auch der Alphachannel wird richtig gespeichert. Die RIO PNGImages Klasse macht das falsch und durch das Schwarz setzten des Hintergrunds wird beim speichern das Bitmap "kaputt" gemacht. Das heisst, die altbekannte Transparenz beim Bitmap wird gesetzt (Farbe Schwarz) und der Alphachannelbereich der Grafik wird nicht transparent. Mit der alten Version wird keine Transparenz gespeichert und daher sieht das da auch richtig aus. Ich erwarte hier auch garnicht, dass das Bitmap eine Trnasparenz bekommt, da TBitmap das Bild nicht mit dem Alphachannel speichert. Die neue Version versucht das Bitmap transparent zu machen, das geht aber nur solange kein Alphachannel im Spiel ist, ansonsten sieht das Bitmap fürchterlich aus.

Siehe die anghängten Bilder und das beigefügte Demoprojekt.
- transAlpha.png Originaldatei
- transAlphaRio.bmp Speicherung der Bitmap nach dem Assign mit der aktuellen VCL.Imaging.PNGImages.pas
- transAlphaD7.bmp Speicherung der Bitmap nach dem Assign mit der alten D7 PNGImges.pas

Wer die D7 Version der PNGImages nicht hat, kann einfach die beiden von mir oben erwöhnten Zeilen in der aktuellen Version löschen und schon ist alles wieder wie es sein soll.
Angehängte Dateien
Dateityp: zip PNG-BMP-Images.zip (851,3 KB, 2x aufgerufen)

Geändert von Rolf Frei (22. Apr 2020 um 12:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: PNG in TImage falsch dargestellt

  Alt 22. Apr 2020, 12:12
Okay, alles klar. Ich gehe auch den Umweg über ein TBitmap, da letztendlich eine Darstellung in einer TImageList erfolgen soll (genauer gesagt Replace, das erfordert eben ein TBitmap). Funktioniert tadellos. Allerdings - wie du schon richtig erkannt hast - geht es um die reine Darstellung.
Michael Kübler
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.139 Beiträge
 
Delphi 2009 Professional
 
#3

AW: PNG in TImage falsch dargestellt

  Alt 22. Apr 2020, 18:13
Hast du vergessen zu speichern?[/DELPHI]
Ups. Ist angehängt.

Okay, alles klar. Ich gehe auch den Umweg über ein TBitmap, da letztendlich eine Darstellung in einer TImageList erfolgen soll (genauer gesagt Replace, das erfordert eben ein TBitmap).
Dann haben sie das wohl inzwischen repariert, dass Replace mit Transparenz klarkommt so wie es Add und Insert schon vorher konnten.
Angehängte Dateien
Dateityp: 7z TransTest.7z (240,0 KB, 4x aufgerufen)
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
tumo

Registriert seit: 28. Apr 2014
49 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: PNG in TImage falsch dargestellt

  Alt 22. Apr 2020, 18:16
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?
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.139 Beiträge
 
Delphi 2009 Professional
 
#5

AW: PNG in TImage falsch dargestellt

  Alt 22. Apr 2020, 18:41
Lad mal die PNGs hoch.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
tumo

Registriert seit: 28. Apr 2014
49 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: PNG in TImage falsch dargestellt

  Alt 22. Apr 2020, 18:50
Ok.
Hier sind sie
Angehängte Grafiken
Dateityp: png PNG 5.png (536 Bytes, 71x aufgerufen)
Dateityp: png PNG 4.png (1,6 KB, 71x aufgerufen)
Dateityp: png PNG 3.png (1,4 KB, 67x aufgerufen)
Dateityp: png PNG 2.png (1,6 KB, 67x aufgerufen)
Dateityp: png PNG 1.png (1,3 KB, 72x aufgerufen)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.139 Beiträge
 
Delphi 2009 Professional
 
#7

AW: PNG in TImage falsch dargestellt

  Alt 23. Apr 2020, 09:14
Kriege das nicht reproduziert mit Delphi 10.3... Habe LoadFromFile probiert und Laden zur Entwurfszeit. Kein Fehler.

Spannend wird es eh erst bei Palettenbildern mit Alpha-Kanal.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
tumo

Registriert seit: 28. Apr 2014
49 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: PNG in TImage falsch dargestellt

  Alt 23. Apr 2020, 12:22
Kriege das nicht reproduziert mit Delphi 10.3... Habe LoadFromFile probiert und Laden zur Entwurfszeit. Kein Fehler.
Spannend wird es eh erst bei Palettenbildern mit Alpha-Kanal.
Das wäre PNG 4 (Das mit der "Blume"). Dort bekomme ich sowohl zur Design-Zeit, als auch mit LoadFromStream und LoadFromFile diese schwarzen Ränder. Meine pngimage Library Version ist übrigens 1.564 (Was offenbar die aktuellste ist). Hast du auch Stretch=true gesetzt (und optional auch Proportional=true)? Ich nutze Delphi 10.3.3 Community und der Fehler tritt wie auf Kommando auf. Warum nur ich damit gepeinigt werden sollte ist mir ein Rätsel

Geändert von tumo (23. Apr 2020 um 12:29 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
989 Beiträge
 
Delphi 6 Professional
 
#9

AW: PNG in TImage falsch dargestellt

  Alt 23. Apr 2020, 10:40
Hmm..

Ok.
Hier sind sie
Damit die Bilder im Original angehängt werden können, musst Du diese in nen ZIP packen..

Die Website recodiert die Bilder sonst beim Hochladen
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
tumo

Registriert seit: 28. Apr 2014
49 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: PNG in TImage falsch dargestellt

  Alt 23. Apr 2020, 10:52
Das wusste ich nicht.
Dann hier nochmal als Zip.
Angehängte Dateien
Dateityp: zip PNGs.zip (5,7 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz