Hallo Namenloser!
erstmal vielen vielen dank für die schnelle antwort und ich kann dich beruhigen, dein delphi scheinst du immer noch einwandfrei zu beherrschen!
naja, jedenfalls fast wenn man das vergessene semikolon ganz am schluss der ersten zeile ausschliesst.
Der code scheint echt sehr schnell zu sein, genau das was ich gesucht habe jedoch ist diese lösung leider primär wohl für
VCL und nicht FMX da das TBitmap von FMX kein ScanLine besitzt/unterstützt. Ich habe die funktion trotzdem mal ein wenig umgeschrieben, dass sie intern ein
vcl bitmap benutzt aber doch ein fmx bitmap zurück gibt, halt wieder durch das speichern und laden des streams. ausserdem schien der alpha channel nicht zu funktionieren und habe ihn das PixelFormat auf pf24bit geändert, Alpha brauche ich nicht unbedingt.
Hier die umgebaute funktion:
Delphi-Quellcode:
procedure PixelArrayToBitmap(
const PixelArray:
array of Byte;
const Width: Integer;
const Height: Integer; Bitmap: TBitmap);
var
y: integer;
LBitmap :
VCL.Graphics.TBitmap;
LMemStream : TMemoryStream;
begin
LBitmap :=
VCL.Graphics.TBitmap.Create;
try
LBitmap.PixelFormat := pf24bit;
LBitmap.SetSize(Width, Height);
for y := 0
to Height - 1
do
Move(PixelArray[Width*y], LBitmap.Scanline[y]^, 3*Width);
try
LMemStream := TMemoryStream.Create;
LBitmap.SaveToStream(LMemStream);
Bitmap.LoadFromStream(LMemStream);
finally
LMemStream.Free;
end;
finally
LBitmap.Free;
end;
end;
Diese erzeugt mir mein FullHD Bitmap innerhalb von kürzester Zeit, danke dafür!
Ich werde nun ein paar tests durchführen und mal sehen ob die FMX variante von setpixel brauchbar ist im gegensatz zu der sehr langsamen
VCL methode, was ich aber bezweifle >_<
Sollte sich noch eine Lösung finden die man direkt unter FMX benutzen könnte um den performance verlust des umwandeln von einem
vcl in ein fmx bitmap zu umgehen wäre ich natürlich auch sehr sehr froh darüber.
Freundliche Grüsse