delphi FireMonkey处理图形的方式与VCL处理图形的方式大不相同


本文整理自网络,侵删。

 
FireMonkey处理图形的方式与VCL处理图形的方式大不相同。

在VCL,图形使用衍生自专门的类处理Vcl.Graphics.TGraphic,诸如Vcl.Graphics.TBitmap和Vcl.Imaging.jpeg.TJPEGImage。当您要加载/保存特定的图形类型时,可以创建特定的类。

在FireMonkey中,使用从类FMX.Graphics.TCustomBitmapCodec注册的特殊类处理图形FMX.Graphics.TBitmapCodecManager。您可以使用通用FMX.Graphics.TBitmap类来处理所有图形。加载图形时,它会使用适当的注册编解码器(如果可以找到它),但是在保存时,必须指定要使用的编解码器。

FireMonkey为每个平台使用不同的编解码器实现,因此没有子类可以像VCL中那样子类化。因此,为了在FireMonkey中自定义JPEG处理,您将必须创建自己的TCustomBitmapCodec派生编解码器并向其注册TBitmapCodecManager(取消注册.jpg和.jpeg扩展名的现有类)。这是FireMonkey当前实现的编解码器类:

Windows:TBitmapCodecWIC在FMX.Canvas.D2D.pas
OSX:TBitmapCodecQuartz在FMX.Canvas.Mac.pas
iOS版:TBitmapCodecQuartz在FMX.Canvas.iOS.pas
Android:TBitmapCodecAndroid在FMX.Canvas.Android.pas
使用{$IFDEF}语句,您可以根据需要在自定义编解码器中利用这些现有类。

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 xe 横屏竖屏的管理

Delphi spcomm 调试串口解决总是在程序断开的时候才发送指令的问题

Delphi nativeexcel获取excel所有列

Delphi中实现hextostr函数和strtohex函数

Delphi 合并两个 wav 文件流的函数

Delphi superobject json操作类的基本用法

Delphi datasnap 获取客户端ip

Delphi idhttp代理设置

Delphi memo1自动循环上下滚屏

Delphi 数组复制利用copymemory 最为完美

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...