Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Transparentes PNG zu BMP (https://www.delphipraxis.net/118537-transparentes-png-zu-bmp.html)

schwa226 9. Aug 2008 22:42


Transparentes PNG zu BMP
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

nach vielen Versuchen und Suchen hier im Forum komme ich nun nicht weiter!

Ich möchte Logos die im PNG Format die mit Alphachannel vorliegen in 1Bit BMP wandeln.

Um die Datei zu laden habe ich PNGImage.pas verwendet, jedoch kommt dadurch nur Blödsinn raus wie am 2. Logo erkennbar ist.
Danach habe ich versucht mit "ReduceColors" (uses GIFImage) auf Swarzweiß umzuwandeln wodurch das Logo gar nicht mehr erkennbar ist wie das 3. Logo zeigt. Bei PNG ohne Transparenz geht es auf diese Weise!

Auch das direkte Anzeigen im TImage mit PNGImage geht, aber da kann man das Logo nicht Resizen. Zusätzlich brauche ich die Konvertierung zu Schwarzweiß, da ich die Logos an ein gLCD schicken will. D.h. das Schwarzweiß-Logo muss dann auch noch in ein ByteArray zerlegt werden!

Das Ergebniss sollte so aussehen wie das 4. Logo. Wie kann man das lösen? (Das 4. Logo habe ich mit XnView per Hand bearbeitet)

igel457 9. Aug 2008 22:48

Re: Transparentes PNG zu BMP
 
Kopiere das Bitmap direkt über die entsprechenden Scanline/AlphaScanline Properties von TPNGImage. Dabei kannst du auch direkt die 1-Bit Umwandlung durchführen.

schwa226 16. Aug 2008 21:23

Re: Transparentes PNG zu BMP
 
Kann mir jemand helfen? Bekomme es einfach nicht hin

Code:
procedure TForm4.Button5Click(Sender: TObject);
type

  TRGBQuads = array[0..0] of Longword;
  PRGBQuads = ^TRGBQuads;

var

  Bitmap: TBitmap;
  PNG: TPNGObject;
  i,y:integer;
  Src1Line, Src2Line, ResultLine: PRGBQuads;
begin

  PNG := TPNGObject.Create;
  Bitmap := TBitmap.Create;

  try
    PNG.LoadFromFile('c:\Test.png');

    Bitmap.Height := PNG.Height;
    Bitmap.Width := PNG.Width;

    for i := 0 to PNG.Height - 1 do
    begin

      Src1Line := PNG.ScanLine[i];
      Src2Line := Bitmap.ScanLine[i];

      for y := 0 to PNG.Width -1 do begin
        Src2Line[y] := Src1Line[y];
      end;

    end;

    Image1.Picture.Assign(Bitmap);
     

  finally
    PNG.Free;
    Bitmap.Free;
  end

end;
Jedoch bleibt Image1 weiß! Komm nicht weiter ein Transparentes PNG richtig in ein BMP zu kopieren...

Medium 17. Aug 2008 02:17

Re: Transparentes PNG zu BMP
 
Delphi-Quellcode:
procedure TForm4.Button5Click(Sender: TObject);
type
  TRGBQuads = Longword;
  PRGBQuads = ^TRGBQuads;
var
  Bitmap: TBitmap;
  PNG: TPNGObject;
  i,y: integer;
  Src1Line, Src2Line, ResultLine: PRGBQuads;
begin
  PNG := TPNGObject.Create;
  Bitmap := TBitmap.Create;
  Bitmap.Pixelformat := pf32Bit; // !!!
  try
    PNG.LoadFromFile('c:\Test.png');
    Bitmap.Height := PNG.Height;
    Bitmap.Width := PNG.Width;
    for i := 0 to PNG.Height - 1 do
    begin
      Src1Line := PNG.ScanLine[i];
      Src2Line := Bitmap.ScanLine[i];
      for y := 0 to PNG.Width -1 do begin
        Src2Line^ := Src1Line^; // !!!
        inc(Src1Line); // !!!
        inc(Src2Line); // !!!
      end;
    end;
    Image1.Picture.Assign(Bitmap);
  finally
    PNG.Free;
    Bitmap.Free;
  end
end;
Die Konstruktion mit dem Array[0..0] of Longword erscheint mir seltsam "C-isch". Ein RGBQuad ist nichts weiter als ein Cardinal bzw. eben Longword, und um darauf einen Pointer zu erhalten reicht schon PCardinal oder von mir aus auch etwas verklausulierter wie im QT oben. Das mit dem Array macht dann Sinn, wenn man auf die Farbanteile einzeln zugreifen möchte, wo man dann etwas der Art macht:
Delphi-Quellcode:
type
  TRGBQuad = packed array[0..3] of Byte;
  PRGBQuad = ^TRGBQuad;

// oder als Record:
  TRGBQuad = packed record
    a, r, g, b: Byte;
  end;
  PRGBQuad = ^TRGBQuad;
Du arbeitest mit Delphi, daher solltest du auch dereferenzieren wenn du Werte zuweisen möchtest, und inkrementieren statt die 0-Array-Krücke zu missbrauchen (was bei eingeschalteter Bereichsprüfung auch knallen dürfte). Dennoch wirst du je nach dem was nachher mit den Bitmaps passiert deine Transparenz verlieren, da die GDI diese einfach nicht kennt und verarbeitet. Wann immer du nun dieses Bitmap irgendwo hinzeichnest, musst du dich von Hand darum kümmern, oder aber du steigst auf GDI+ oder die Graphics32 Library um, die beide Transparenzen beachten (können).
Das Pixelformat solltest du wie oben gezeigt auch auf jeden Fall explizit setzen.

schwa226 19. Aug 2008 18:39

Re: Transparentes PNG zu BMP
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank für den Tipp!

mit dem inc hätt ich auch noch draufkommen müssen..

jedoch funktioniert es immer noch nicht!

Im Anhang sieht man, dass es mit dem Transparenten PNG immer noch Probleme gibt. Habe das Orignal PNG für Versuche auch reingepackt.

Wo liegt hier der Fehler?


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