delphi - 在 Firemonkey 中使用 JPG

标签 delphi firemonkey delphi-10-seattle

我有一个压缩图像,我正在尝试接收它并在android平台上显示它,在vcl中我一直在做类似以下的事情

procedure TForm1.CreateJpg(Data: string);
var
  JpegStream: TMemoryStream;
  JpegImage: TJPEGImage;
  Bitmap: TBitmap;
  tmpPos, tmpLen: integer;
  pp: string;
begin

  try
    tmpPos := Pos('B]>', Data);
    pp := Copy(Data, 5, tmpPos - 5);
    tmpLen := StrToInt(pp);
    Data := Copy(Data, tmpPos + 3, tmpLen);
    Bitmap := TBitmap.Create;

    try
      JpegImage := TJPEGImage.Create;

      try
        JpegStream := TMemoryStream.Create;

        try
          TIdDecoderMIME.DecodeStream(Data, JpegStream);
          JpegStream.Position := 0;
          JpegImage.LoadFromStream(JpegStream);
        finally
          JpegStream.Free;
        end;

        with Bitmap do
        begin
          Canvas.Lock;

          try
            Width := JpegImage.Width;
            Height := JpegImage.Height;
            Canvas.StretchDraw(rect(0, 0, 200, 160), JpegImage);
          finally
            Canvas.Unlock;
          end;
        end;
      finally
        JpegImage.Free;
      end;

      img.Assign(Bitmap);
    finally
      Bitmap.Free;
    end;
  except
    on E: Exception do
      //
  end;
end;

但是我不能在android中做同样的事情,因为没有TJPEGIMAGE库的声明我不确定我是否可以在上做一些事情来替代JPEG Fire-monkey 我对我必须做什么感到困惑

最佳答案

VCL 使用 TGraphic 派生类来处理各个图像类型。然而,FireMonkey 中没有与 TGraphic 等效的东西。它只有一个 TBitmap支持多种图像类型的类。不同的 FMX 平台支持不同的图像类型子集(有关完整列表,请参阅 Supported Image Formats)。幸运的是,JPG 是所有 FMX 平台都支持的仅有的两种图像类型之一(另一种是 PNG)。

与 VCL 代码等效的 FMX 看起来像这样:

procedure TForm1.CreateJpg(Data: string);
var
  JpegStream: TMemoryStream;
  Jpeg, Bitmap: TBitmap;
  tmpPos, tmpLen: integer;
  pp: string;
begin
  try
    tmpPos := Pos('B]>', Data);
    pp := Copy(Data, 5, tmpPos - 5);
    tmpLen := StrToInt(pp);
    Data := Copy(Data, tmpPos + 3, tmpLen);

    Bitmap := TBitmap.Create;
    try
      Jpeg := TBitmap.Create;
      try
        JpegStream := TMemoryStream.Create;
        try
          TIdDecoderMIME.DecodeStream(Data, JpegStream);
          JpegStream.Position := 0;
          Jpeg.LoadFromStream(JpegStream);
        finally
          JpegStream.Free;
        end;

        with Bitmap do
        begin
          SetSize(Jpeg.Width, Jpeg.Height);

          if Canvas.BeginScene then
          try
            Canvas.DrawBitmap(Jpeg,
                {$IF RTLVersion >= 31} // 10.1 Berlin or higher
                Jpeg.BoundsF,
                {$ELSE}
                TRectF.Create(0, 0, Jpeg.Width, Jpeg.Height),
                {$IFEND}
                TRectF.Create(0, 0, 200, 160), 1.0);
          finally
            Canvas.EndScene;
          end;
        end;
      finally
        Jpeg.Free;
      end;

      img.Bitmap.Assign(Bitmap);
    finally
      Bitmap.Free;
    end;
  except
    on E: Exception do
      //
  end;
end;

关于delphi - 在 Firemonkey 中使用 JPG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43106420/

相关文章:

delphi - 如何在Delphi中向HLDS服务器发送UDP数据包?

android - 他们是否根据屏幕大小设置图标/字体/等大小的任何规则

delphi - 支持多种屏幕尺寸

delphi - 用 PChar 操作替换字符串赋值

delphi - 如何创建一个可与 VCL 和 FMX 一起使用的内部计时器?

javascript - 在 TWebBrowser 中将字符串传递给 Javascript 时可能出现编码问题

delphi - 如何在Delphi中获取外部(公共(public))IP

delphi-xe2 - 将多行粘贴到 TEdit 中

Delphi - 如何裁剪位图 "in place"?

android - Delphi XE5 Firemonkey API调用