AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Transparentes PNG zu BMP
Thema durchsuchen
Ansicht
Themen-Optionen

Transparentes PNG zu BMP

Ein Thema von schwa226 · begonnen am 9. Aug 2008 · letzter Beitrag vom 19. Aug 2008
Antwort Antwort
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#1

Re: Transparentes PNG zu BMP

  Alt 17. Aug 2008, 02:17
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:15 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