![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:14 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