![]() |
AW: PNG in TImage falsch dargestellt
Ich stehe da im Moment etwas auf Kriegsfuss mit der Embarcadero Website, da ich da aktuell nicht mehr den Überblick habe, was da nun aktuell ist und was nicht. Wo muss ich das genau machen, damit ich nicht irgendwo was erfasse, das garnicht mehr genutzt wird? Für mich wirkt das alles aktuell wie eine grosse Baustelle, wo man nicht mehr recht weiss, was wo zu machen ist.
Ist da qualitiy.embarcadero.com noch der richtige Platz dafür? |
AW: PNG in TImage falsch dargestellt
Zitat:
![]() |
AW: PNG in TImage falsch dargestellt
Zitat:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} end. |
AW: PNG in TImage falsch dargestellt
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
|
AW: PNG in TImage falsch dargestellt
Nach weiterem überlegen, probieren und googlen habe ich "herausgefunden", dass der Anzeigefehler nur auftritt, wenn die PNG im ColorMode 3 (Paletten-Modus) geladen wird. @Redeemer hatte also den richtigen Riecher (oder womöglich schon eine Lösung?). Warum genau dadurch Ränder schwarz angezeigt werden, wo die Pixeldaten eig. richtig sind, bleibt mir aber ein Rätsel. Mit der Graphics32 Library habe ich jetzt ein wenig rumprobiert. Sie geht, aber recht umständlich in manchen Belangen. Die essentielle Funktion für mich (PNGs laden) geht nur mit einer extra Unit, die man noch dazu installieren muss :/. Sollte es also eine Lösung für die VCL TImages geben, wäre ich sehr erfreut, diese zu erfahren.
@scrat1979 Wie gesagt, es ist nur bei manchen PNGs. Um genau zu sein bei PNGs im ColorMode 3 (Paletten-Modus) |
AW: PNG in TImage falsch dargestellt
@Tumo: Alles klar, könnte die Erklärung sein, dass es bei mir - Gott sei dank - funktioniert. Wollte es auch nur der Vollständigkeit halber erwähnen.
Viel Erfolg dir weiterhin :) |
AW: PNG in TImage falsch dargestellt
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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. |
AW: PNG in TImage falsch dargestellt
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.
|
AW: PNG in TImage falsch dargestellt
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
|
AW: PNG in TImage falsch dargestellt
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:
Code 2:Image.Picture.LoadFromStream(AStream);
Delphi-Quellcode:
Code 3:
png := TPNGImage.Create;
png.LoadFromStream(AStream); Image.Picture.Graphic := png;
Delphi-Quellcode:
Code 4:
png := TPNGImage.Create;
png.LoadFromStream(AStream); bmp := TBitmap.Create; bmp.Assign(png); Image.Picture.Graphic := bmp;
Delphi-Quellcode:
Daraus habe ich diese Tabelle kreiert:
png := TPNGImage.Create;
png.LoadFromStream(AStream); bmp := TBitmap.Create; bmp.Assign(png); Image.Picture.Graphic := bmp; Image.Transparent := png.TransparencyMode = ptmBit
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
Delphi-Quellcode:
aber auch
png.Pixels
Delphi-Quellcode:
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.
bmp.Pixels
Ich wollte mal erfahren, ob Ihr den Fehler reproduzieren könnt? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:16 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