Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Transparentes Paletten-PNG strecken (https://www.delphipraxis.net/216440-transparentes-paletten-png-strecken.html)

Redeemer 29. Dez 2024 20:14

Transparentes Paletten-PNG strecken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich möchte mit der aktuellen CE ein transparentes Paletten-PNG gestreckt anzeigen. Das klappt nicht.

Vorgehensweise:
1. TImage platzieren
2. Paletten-PNG mit Transparenz laden, das nicht die Größe von TImage hat. Dieses muss mindestens ein nicht-schwarzes Pixel enthalten, von dem aus sich links, oben oder oben-links mindestens 1 transparentes Pixel befindet.
3. Stretch anmachen

Erwartetes Ergebnis:
Die PNG wird dargestellt.

Tatsächliches Ergebnis:
Alle deckenden Pixel, von denen aus sich direkt links, oben oder oben-links mindestens 1 transparentes Pixel befindet, sind stattdessen schwarz. (Bevor jemand fragt, ob Pixel, die es gar nicht gibt, transparent sind: nein. Der Fehler kann also in (0,0) nicht auftreten.) Bei sehr kleinen Vergrößerungsfaktoren (unter ca. 2) kann es sein, dass der Fehler nicht bei jedem Pixel auftritt.

Suche nach der Lösung:
Die fehlerhafte Methode fällt einem sofort auf:
Delphi-Quellcode:
DrawTransparentBitmap()
. Die wird auch nur bei Palettenbildern aufgerufen. Dort wird diverse Male
Delphi-Quellcode:
BitBlt
und
Delphi-Quellcode:
StretchBlt
aufgerufen.
Delphi-Quellcode:
StretchBlt
und zu dunkle Pixel, kann nun wirklich jeder Windows-User ein Lied von singen und nicht nur Programmierer. Die Standardeinstellung für die Methode heißt nämlich
Delphi-Quellcode:
BLACKONWHITE
, macht aber tatsächlich ein sinnloses AND zwischen Pixeln und ist somit absoluter Schwachsinn.

Lösung:
Delphi-Quellcode:
SetStretchBltMode(hdcTemp, COLORONCOLOR);
einfügen nach
Delphi-Quellcode:
SetBkColor(hdcTemp, cColor);
. Die neue Zeile ist bei mir 902.
Das Argument
Delphi-Quellcode:
HALFTONE
geht auch, aber
Delphi-Quellcode:
COLORONCOLOR
scheint logisch die richtigere Variante zu sein und ist angeblich performanter.

Frage:
Ist das in der aktuellen kommerziellen Delphi-Version immer noch kaputt oder muss ich einen QP-Report abschicken?
Beispiel ist angehängt. Alle deckenden Pixel sind weiß. Einfach in ein TImage laden und Stretch anmachen, dann sollten die meisten Pixel schwarz sein.

jaenicke 30. Dez 2024 07:33

AW: Transparentes Paletten-PNG strecken
 
Ja, das ist auch in Delphi 12 mit Update 2 noch so. Es kommt ein Muster mit schwarzen, grauen und weißen Pixeln heraus.

Für den Eintrag brauchst du die Buildnummer: 29.0.51961.7529

Redeemer 31. Dez 2024 09:59

AW: Transparentes Paletten-PNG strecken
 
Danke, habe ich angelegt.
Gibt es eine Möglichkeit, Requests nach dem Abschicken zu bearbeiten?

Immerhin kann ich jetzt eine Request-Liste sehen.

jaenicke 31. Dez 2024 13:21

AW: Transparentes Paletten-PNG strecken
 
Nein, man kann nur Kommentare hinzufügen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 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