Einzelnen Beitrag anzeigen

gemeni2005

Registriert seit: 2. Jul 2007
Ort: München
28 Beiträge
 
Delphi 10.4 Sydney
 
#1

JPEG dekomprimieren mit TurboJPEG

  Alt 6. Jun 2021, 14:06
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
  Mit Zitat antworten Zitat