![]() |
AW: PNG in TImage falsch dargestellt
Ich habe jetzt nicht alles gelesen..
Aber was für eine Qualität bzw. Ansicht erwartest du bei einem Indizierten *.png! Das kann nur inkorrekt dargestellt werden. Ändere es doch einfach mal von 8 auf 32Bit. Ich behaupte jetzt einfach mal das TImage mit indizierten *.png's nicht klar kommt. |
AW: PNG in TImage falsch dargestellt
Zitat:
|
AW: PNG in TImage falsch dargestellt
@Medium
Ich wüsste jetzt nicht, wo man den Vergrößerungs-Algorithmus einstellen kann. Tatsächlich macht er das schon mit NearestNeighbour (oder etwas, was verdammt danach aussieht), was auch das ist, was ich will. Verfolgt man die Draw()-Methode von PNGImage landet man mit BitTransparency früher oder später in einer Prozedur mit dem schönen Namen "DrawTransparentBitmap". Da drin wird mit Windows-Blt-Befehlen weiter gearbeitet. Ab da verstehe ich nicht mehr wirklich viel :/. @venice2 Ich erwarte, dass die Pixeldaten korrekt dargestellt werden, auch in vergrösserter Version. Es gibt noch einen Unterschied zwischen hässlich und inkorrekt darstellen. Es "einfach" mal von 8bit auf 32bit zu ändern (1.) geht mit Palettenbildern nicht, (2.) lässt TPNGImage á la BitDepth=32bit nicht zu, (3.) ist in meinem Fall nicht möglich, da die Bilder so gegeben sind. Die Behauptung ist zwar ganz nett, aber eben nicht richtig bzw. offensichtlich. TPNGImage hat einen extra Case für BitTransparency (die nur in Palettenbildern vorkommt) in der Draw()-Methode. Andere, nicht-transparente, indizierte PNGs kann es ja problemlos. |
AW: PNG in TImage falsch dargestellt
Zitat:
Was denn nu TImage oder TPNGImage Zitat:
Es ist ein einfaches dein Paletten Bild im Speicher zu einem vollwertigen 32Bit PNG Image zu konvertieren. Was hindert dich daran. Zitat:
Es scheint mir ohne Komponente seid ihr alle aufgeschmissen. Zitat:
Zitat:
|
AW: PNG in TImage falsch dargestellt
Zitat:
Zitat:
![]() Zitat:
![]() Zitat:
|
AW: PNG in TImage falsch dargestellt
Zitat:
Das umgeht dann ja aber nur das Problem. Mit anderen Worten, ich muss einen Edgecase für ebendiese Problembilder machen. Naja, ich schätze mal, das ist der sinnvollste Weg für mich, manchmal kann man eben nicht alles haben. Wäre das ein Bug, den man so bei Embarcadero einreichen müsste? Hab bisher nichts dazu gefunden, kann also gut sein, dass ich der erste bin, der auf diesen Fehler stößt (was mich aber auch wundern würde). Danke trotzdem für die bisherige Hilfe. |
AW: PNG in TImage falsch dargestellt
Nur damit du siehst das es geht von wegen (So große Töne spucken)
ABer da du Herrn Redeemer angesprochen hast und dieser nur die Leute beleidigen kann soll er dir auch helfen. Aus deinem indizierten *.png im Speicher 24Bit erstellt und extrem vergrößert bzw. auf mein Fenster angepasst. Nicht mal 5 Minuten Arbeit. Damit du nicht denkst es wäre ein fake habe ich noch 2 Bitmaps drüber gelagert. Es ist dein Paletten Bild unverändert. (1 Bit). Einfach nur als Hintergrund geladen Ich werde das Thema nun verlassen. Schönen Tag noch. |
AW: PNG in TImage falsch dargestellt
Hab mir das nochmal angesehen:
Ich habe jetzt folgenden Code geschrieben. Der führt zumindest bei meinem PNGDelphi dazu, dass ein Paletten-PNG in True Color umgewandelt wird. Das funktioniert auch mit den bisher zumindest von meinem PNGDelphi nicht unterstützten 1- und 4-Bit-PNGs. Es gibt sogar 1-Bit- und 4-Bit-PNGs mit Alphakanal. Auch das wird unterstützt.
Delphi-Quellcode:
procedure Deindex(PNG: TPngImage);
var Chroma: array[Byte] of TPaletteEntry; Alpha, ScanlineSource, ScanlineTarget, AlphaScanline: PByteArray; DoAlpha: Boolean; NewPNG: TPngImage; y, x: Integer; BitDepth: Byte; Mask: Byte; x2: Integer; Shift: Byte; begin AlphaScanline := nil; // Compiler-Mimimi Alpha := nil; // Compiler-Mimimi if PNG.Header.ColorType = COLOR_PALETTE then begin DoAlpha := PNG.TransparencyMode <> ptmNone; if DoAlpha then NewPNG := TPngImage.CreateBlank(COLOR_RGBALPHA, 8, PNG.Width, PNG.Height) else NewPNG := TPngImage.CreateBlank(COLOR_RGB, 8, PNG.Width, PNG.Height); try GetPaletteEntries(PNG.Palette, 0, 256, Chroma); BitDepth := PNG.Header.BitDepth; Mask := Word(1) shl BitDepth - 1; if DoAlpha then Alpha := @((PNG.Chunks.FindChunk(TChunktRNS) as TChunktRNS).PaletteValues); // hier bin ich mir unsicher in Sachen Speicherverletzung for y := 0 to PNG.Height - 1 do begin ScanlineSource := PNG.Scanline[y]; ScanlineTarget := NewPNG.Scanline[y]; if DoAlpha then AlphaScanline := NewPNG.AlphaScanline[y]; for x := 0 to PNG.Width - 1 do begin x2 := x * BitDepth div 8; Shift := 8 - BitDepth - ((BitDepth * x) mod 8); ScanlineTarget^[x*3 ] := Chroma[(ScanlineSource^[x2] shr Shift) and Mask].peBlue; ScanlineTarget^[x*3+1] := Chroma[(ScanlineSource^[x2] shr Shift) and Mask].peGreen; ScanlineTarget^[x*3+2] := Chroma[(ScanlineSource^[x2] shr Shift) and Mask].peRed; if DoAlpha then AlphaScanline^[x] := Alpha[ScanlineSource^[x2] shr Shift and Mask]; end; end; except NewPNG.Free(); raise; end; PNG.Assign(NewPNG); NewPNG.Free(); end; end; Zitat:
|
AW: PNG in TImage falsch dargestellt
@OP
Hast du denn nun schon mal die VCL.Imaging.PNGimages.pas in dein loakels Anwendungsverzeichnis kopiert und die beiden von mir erwähnten Zeilen gelöscht und neu kompiliert? @venice2 TImage und TPNGImage haben nichts miteinander zu tun. TPNGImage ist die Grafikklasse (TGraphic), die ein PNG Bild rendert und darstellt. TImage ist eine allgmeine Darstellungskomponente (TControl), die nichts anderes macht als die Paint Funktion der geladenen Graphic-Klasse aufzurufen. Dieses Problem hier hat mit der TImage Komponente nichts zu tun, sondern betrifft die Implementation der TPNGImage Klasse. |
AW: PNG in TImage falsch dargestellt
@Rolf Frei
Ach ja. Das ist im Eifer des Gefechtes etwas in Vergessenheit geraten. Hab es gerade mal probiert, ändert leider nichts an der Situation, besagte PNG wird mit schwarzem Hintergrund dargestellt :/. Hier mein Quellcode:
Delphi-Quellcode:
@Redeemer
png := TPNGImage.Create;
png.LoadFromFile(Path); bmp := TBitmap.Create; bmp.Assign(png); // <-- TPNGImage AssignTo() ist modifiziert. Es fehlen das Brush.Color := 0 sowie das FillRect. Image3.Picture.Graphic := bmp; Dieser Code funktioniert :-). So oder so ähnlich hätte ich es natürlich auch gelöst :P. Spaß beiseite, vielen Dank! Dass die Bilder nicht optimal gespeichert sind, hab ich auch schon gemerkt. Wie gesagt, manche sind mir so gegeben, andere sind von mir in Paint.net erstellt, keine Ahnung, warum es da solche Späßchen generiert. Jetzt hat das Problem einen Workaround. Warum Delphi überhaupt eine Unterscheidung zwischen Partial- und BitTransparency macht, bleibt mir ein Rätsel. Hat das einen entscheidenden Vorteil? Mein Problem ist jetzt jedenfalls behoben bzw. umgangen. Danke euch. Habe es jetzt folgendermaßen gelöst (mit der Prozedur von Redeemer):
Delphi-Quellcode:
var
gfx: TPicture; begin gfx := TPicture.Create; gfx.LoadFromFile(Path); if gfx.Graphic is TPNGImage then Deindex(gfx.Graphic as TPNGImage); Image3.Picture.Assign(gfx); end; |
AW: PNG in TImage falsch dargestellt
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
![]() Unterstützt dein PNGDelphi ohne meinen Algorithmus 4-Bit+Alpha und 1-Bit+Alpha? Ich hab mal zwei Beispiele angehängt. |
AW: PNG in TImage falsch dargestellt
Zitat:
Bei mir war nur der Rahmen um den Bwereich herum da, aber kein Inhalt. |
AW: PNG in TImage falsch dargestellt
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir sind da Bilder. Was für einen Browser benutzt du? Ich habe Firefox 75.
Hab es dir aber nochmal aus 7z angehängt. |
AW: PNG in TImage falsch dargestellt
Zitat:
Aber auch nur, wenn es korrekt geht :P. Was deine Bilder angeht, mein Delphi (bzw. mein pngimage) kann die problemlos darstellen. Ist wohl wirklich nur bei BitTransparency. |
AW: PNG in TImage falsch dargestellt
Liste der Anhänge anzeigen (Anzahl: 1)
Ich muss leider noch mal stören.
@Redeemer Dein Code hat ein Problem mit 2bit Palettenbildern. Beim drüberschauen ist mir jedoch kein Fehler aufgefallen. 8bit und 4bit geht dafür aber super :) Falls es hilfreich ist, in deinem Code scheinen tatsächlich keine Fehler zu sein, die Daten von der Source-Scanline sind falsch(?). Bei meinem Testbild in Zeile y=4 hat er für x2=1 den Scanline-Wert 50 (oder 0011 0010). Abgesehen davon, dass die damit korrespondierenden Pixel die Farbreihenfolge (nach Chroma) von 01 01 10 11 haben müssten (was in den Scanline-Daten gleich garnicht stehen kann, aufgrund der Transparenz von 00 und 01 aber nicht auffällt), scheint etwas an ebendiesem Punkt falsch zu laufen. |
AW: PNG in TImage falsch dargestellt
Klappt bei mir in Delphi 2009 ohne Probleme mit meiner Methode. Bitdepth ist zwar 4, was scheinbar falsch ist, die Daten liegen aber auch so im Speicher, als ob es 4 wäre (bei mir und bei dir!).
Was ist Bitdepth bei dir? Falls 2, was passiert, wenn du BitDepth (also die Variable in meiner Methode) direkt nach dem Setzen auf 4 setzt? |
AW: PNG in TImage falsch dargestellt
Also beim Auslesen des Headers bekomme ich: Indexed 2bit. Ironischerweise wird es ohne deinen Code korrekt dargestellt. Beim setzen auf 4bit funktioniert es auch korrekt. So langsam frage ich mich, was in der pngimage-Library eigentlich nicht fehlerhaft ist :D.
Was ist Dein Gedanke?
Delphi-Quellcode:
EDIT: Wenn man die png.Pixels Property nutzt, funktioniert es auch nicht. Es wird immer kurioser, fast, als hätte sich diese Lib nie wieder jemand angeschaut oder überprüft, dass sie auch das kann, was sie anbietet.
BitDepth := PNG.Header.BitDepth;
if BitDepth < 4 then BitDepth := 4; |
AW: PNG in TImage falsch dargestellt
Zitat:
Delphi-Quellcode:
Oder hast du Probleme mit simple3.png, dem gelb-pinken Bild aus meinem Anhang? Dein Code würde auch da das Verhalten ändern, denn das hat 1BPP.
BitDepth := PNG.Header.BitDepth;
if BitDepth = 2 then BitDepth := 4; |
AW: PNG in TImage falsch dargestellt
Ach ja. Geht jetzt. Trotzdem komisch das ganze...
Danke Dir nochmal. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 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