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)