Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   PNG in TImage falsch dargestellt (https://www.delphipraxis.net/204002-png-timage-falsch-dargestellt.html)

tumo 14. Apr 2020 13:38

Delphi-Version: 10.3 Rio

PNG in TImage falsch dargestellt
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo,

ich habe ein kleines Programm, was mir Texturen auflistet und diese nach Bedarf anzeigt. Die Texturen sind als PNG gespeichert und werden (dank PNGImage) auch problemlos von Delphi geladen. Die Texturen sind fast immer 32x32 px groß und damit ich diese auf einem FHD Bildschirm auch ordentlich beurteilen kann, dachte ich, ich stelle sie ein wenig größer dar. TImage war von dieser Idee leider weniger begeistert, da es manche der Texturen mit schwarzem Outline darstellt. Dabei trat der Fehler bisher nur bei Bildern mit (genutztem) Alpha-Channel auf, jedoch auch nicht bei jedem Bild mit Alpha-Werten. Damit ist die Beurteilung der Texturen logischerweise unmöglich, da nicht korrekt dargestellt. Wenn ich mir die Pixeldaten vom TImage (!) ausgeben lasse, ist alles korrekt, also muss ein Fehler bei der gestreckten Darstellung passieren.

Zum Verständnis: Das TImage hat
Delphi-Quellcode:
Proportional := true
und
Delphi-Quellcode:
Stretch := true
. Das TImage soll das Bild auf eine Größe von 144x144 px, ultimativ aber auf jede beliebige Größe skalieren können. Der Fehler tritt nicht auf, wenn das TImage auf 64x64 px (x2) skaliert, bei 128x128 px (x4) wiederum schon.

Was übersehe ich hier? Warum werden bei manchen (aber nicht allen) PNGs solche Outlines dargestellt?

Im Anhang sehr ihr einmal das Originalbild (in 32 px und 144 px) und was das TImage daraus macht (in 144 px).

Medium 14. Apr 2020 14:01

AW: PNG in TImage falsch dargestellt
 
TImage (zumindest das der VCL) basiert auf der alten GDI, welche mit Transparenzen nicht wirklich umzugehen weiß, auch wenn sie korrekt in den Rohdaten stehen. Wenn du bei VCL bleiben willst (bzw. musst), ist die Graphis32 Lib eine sehr sehr gute freie und offene Alternative, die auch mit Transparenz vernünftig spielt. Man könnte auch auf die GDI+ zurückgreifen, da gibt es auch freie Header zu, jedoch fand ich die Arbeit damit immer recht klobig. Dazu kommt, dass auch GDI+ schon seit Jahren abgekündigt ist.

Sherlock 14. Apr 2020 15:10

AW: PNG in TImage falsch dargestellt
 
Mein Favorit ist das deutlich modernere Delphi-Referenz durchsuchenTWicImage.

Sherlock

himitsu 14. Apr 2020 15:58

AW: PNG in TImage falsch dargestellt
 
Zitat:

Zitat von Sherlock (Beitrag 1462021)

Natürlich nur in der VCL, da es die WinAPI nutzt und leider sind auch da paar Dinge blöd eingebaut, vor allem da im StretchDraw nicht deren API Inteface genutzt wird, sondern das auf brutalst mögliche Weise selbst implementiert wurde.

Redeemer 14. Apr 2020 18:11

AW: PNG in TImage falsch dargestellt
 
Sind die PNGs, wo es nicht geht, Palettenbilder?

tumo 14. Apr 2020 21:12

AW: PNG in TImage falsch dargestellt
 
Danke für die schnellen Antworten.

@Medium
Habe mir die graphics32 mal angeschaut. Nach fast einer halben Stunde Harreraufen mit den Delphi Settings ging es dann endlich. Es tut, was es muss, aber nicht so richtig was es soll. Nicht falsch verstehen, meine Bitmaps werden bildschön, skaliert und mit Transparenz angezeigt, aber die eigentliche Zuweisung der Bitmaps ist alles andere als verständlich für mich :stupid:. Habe eine Liste mit Objekten, die Namen, ein paar andere Daten und eben auch die Bilder selbst speichern sollen. Diese sollen dann bei Bedarf angezeigt werden, aber irgendwie bekomme ich die Bitmap nicht von meinem Objekt in das Image32 gedrückt :|.

@Redeemer
Darf ich erfahren, was Palettenbilder sind?

himitsu 14. Apr 2020 21:26

AW: PNG in TImage falsch dargestellt
 
Zitat:

Zitat von tumo (Beitrag 1462053)
Darf ich erfahren, was Palettenbilder sind?

Wie z.B. bei den 2-, 16- oder 256-Farben-Bitmaps.

PNG kann die Pixel jeweils als RGB speichern, aber es geht auch als Index in einer Farbpalette.

tumo 14. Apr 2020 21:42

AW: PNG in TImage falsch dargestellt
 
Ah.
Nun, nicht das ich wüsste.

Medium 15. Apr 2020 07:29

AW: PNG in TImage falsch dargestellt
 
Zitat:

Zitat von tumo (Beitrag 1462053)
[...]irgendwie bekomme ich die Bitmap nicht von meinem Objekt in das Image32 gedrückt :|.

Grundsätzlich sollte das mit einem TBitmap32.DrawTo(TImage32.Bitmap) erledigt sein, ggf. noch ein TImage32.Bitmap.Clear vorausgeschickt. Zeig im Zweifel doch mal das Stück Code, in dem das gemacht wird. Dann kann man evtl. konkreter helfen.

Redeemer 15. Apr 2020 07:43

AW: PNG in TImage falsch dargestellt
 
Zitat:

Zitat von tumo (Beitrag 1462058)
Ah.
Nun, nicht das ich wüsste.

Na ja, die PNG wird es dir nicht von selbst sagen. Da musst du mit einem geeigneten Programm nachschauen. Die Unterstützung für PNG8 mit Alphakanal ist sehr uneinheitlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:36 Uhr.
Seite 1 von 6  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz