![]() |
PNG-Bild mit Transparenz erzeugen
Hallo,
mein Programm soll aus vorhandenen Daten ein transparentes PNG-Bild erzeugen. Zuerst hatte ich den Alphawert einfach immer weggelassen, allerdings wollte ich nun versuchen ihn mit rein zunehmen, da die Bilder sonst immer einen schwarzen Hintergrund haben und das eben nicht so schön aussieht.
Delphi-Quellcode:
Das Problem ist, dass das Bild einfach nur weiß ist. Wenn ich COLOR_RGBALPHA in COLOR_RGB umwandle sehe ich nur die Umrisse (wegen ARGB und er erwartet ja RGB).
function ARGB(A, R, G, B: Byte): COLORREF;
begin Result := B or (G shl 8) or (R shl 16) or (A shl 24); end; function TPNGMapleCanvas.Parse1(Input: TMemoryStream; deSize: Integer): TPNGImage; var n, x, y, cc: Integer; b1, b2: Word; a, r, g, b: Word; begin Input.Position := 2; // FWidth und Height werden vorher gelesen Result := TPNGImage.CreateBlank(COLOR_RGBALPHA, 16, FWidth, FHeight); n := 0; x := 0; y := 0; while n < deSize do begin if x = FWidth then begin x := 0; Inc(y); if y = FHeight then Break; end; Input.Read(b1, 1); Input.Read(b2, 1); b := b1 and 15; b := b or (b shl 4); g := b1 and 240; g := g or (g shr 4); r := b2 and 15; r := r or (r shl 4); a := b2 and 240; a := a or (a shr 4); cc := ARGB(a, r, g, b); Result.Canvas.Pixels[x, y] := cc; Inc(n, 2); Inc(x); end; end; C# macht einfach das:
Code:
Warum kann es nicht auch in Delphi so einfach sein? :(
[...]
bitmap.SetPixel(x, y, Color.FromArgb(a, r, g, b)); Hat jemand Ideen wie man das auch in Delphi hinkriegen kann? |
Re: PNG-Bild mit Transparenz erzeugen
Versuch mal
Delphi-Quellcode:
Da ich keine Beispieldateien habe, kann ich es auch nicht ausprobieren...
Result := TPNGImage.CreateBlank(COLOR_RGB, 16, FWidth, FHeight);
Result.CreateAlpha; |
Re: PNG-Bild mit Transparenz erzeugen
Liste der Anhänge anzeigen (Anzahl: 1)
Dann seh ich wieder nur die Umrisse der Schnecke.
Hab mal die Rohdaten angehangen, einfach die Prozedur oben (deSize = 1924) drauf anwenden und sich das Bild iwo anzeigen/speichern lassen. |
Re: PNG-Bild mit Transparenz erzeugen
Zitat:
|
Re: PNG-Bild mit Transparenz erzeugen
Oh ja, hab ich ganz vergessen :|
FWidth = 37; FHeight = 26 |
Re: PNG-Bild mit Transparenz erzeugen
Diese kleine Änderung sollte helfen:
Delphi-Quellcode:
cc := ARGB(0, r, g, b); // Alpha wird getrennt gesetzt - siehe zwei Zeilen weiter
Result.Pixels[x, y] := cc; // hier nicht Canvas nehmen! Result.AlphaScanline[y][x] := a; |
Re: PNG-Bild mit Transparenz erzeugen
Klasse, funktioniert wunderbar! :dp:
Hier die Endfassung (ich habe ARGB noch wieder in RGB geändert, da sonst die Farben etwas verfälscht waren):
Delphi-Quellcode:
function TPNGMapleCanvas.Parse1(Input: TMemoryStream): TPNGImage;
var x, y: Integer; b1, b2: Byte; a, r, g, b: Word; begin Result := TPNGImage.CreateBlank(COLOR_RGB, 16, FWidth, FHeight); Result.CreateAlpha; x := 0; y := 0; while Input.Position < Input.Size do begin if x = FWidth then begin x := 0; Inc(y); if y = FHeight then Break; end; Input.Read(b1, 1); Input.Read(b2, 1); b := b1 and 15; b := b or (b shl 4); g := b1 and 240; g := g or (g shr 4); r := b2 and 15; r := r or (r shl 4); a := b2 and 240; a := a or (a shr 4); Result.Pixels[x, y] := RGB(r, g, b); // don't use Canvas here Result.AlphaScanline[y][x] := a; // Now set the alpha value Inc(x); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 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