Hallo,
ich bin gerade dabei mich mit TurboJPEG zu beschäftigen, um die Komprimierung/Dekomprimierung von JPEGs zu beschleunigen.
Das Komprimieren klappt einwandfrei, nur beim Dekomprimieren komme ich nicht weiter. Das JPEG wird (glaube ich) korrekt dekomprimiert und steht in einam TBytes-Array bereit. Nur wie bekomme ich dieses Array nun in eine TBitmap-Instanz? Da stehe ich auf dem Schlauch. Ich habe es mit Scanline versucht, es wird auch etwas erzeugt, nur leider nicht das ursprüngliche Bild.
Mein aktueller Code dazu:
Delphi-Quellcode:
procedure TfrmTurboJPEG.btnCreateBitmapClick(Sender: TObject);
var
JH: TJHandle;
jpegStream: TMemoryStream;
i, Width, Height, Res: Integer;
SubSampling: TJPF;
OutBuf: TBytes;
Bitmap: TBitmap;
begin
if Assigned(imgJPEG.Picture.Graphic) then
begin
JH := Rk.Vcl.Imaging.TurboJPEG.InitDecompress;
jpegStream := TMemoryStream.Create;
Bitmap := TBitmap.Create;
try
imgJPEG.Picture.Graphic.SaveToStream(jpegStream);
Res := Rk.Vcl.Imaging.TurboJPEG.DecompressHeader2(JH, jpegStream.Memory, jpegStream.Size, @Width, @Height, @SubSampling);
CheckError(JH, Res);
SetLength(OutBuf, Width * Height * 4);
Res := Rk.Vcl.Imaging.TurboJPEG.Decompress2(JH, jpegStream.Memory, jpegStream.Size, @OutBuf[0], Width, 0, Height, TJPF_RGBA, 0);
CheckError(JH, Res);
Bitmap.PixelFormat := pf32Bit;
Bitmap.SetSize(Width, Height);
for i := 0 to Height - 1 do
Move(OutBuf[Width*i], Bitmap.Scanline[i]^, 4 * Width);
imgBitmapDecompressed.Picture.Assign(Bitmap);
finally
Rk.Vcl.Imaging.TurboJPEG.Destroy(JH);
jpegStream.Free;
Bitmap.Free;
end;
end;
end;
Es wäre schön, wenn mir jemand einen Lösungsansatz zeigen könnte.
Danke und viele Grüße
Robert