本文整理自网络,侵删。
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.pasOSX:TBitmapCodecQuartz在FMX.Canvas.Mac.pasiOS版:TBitmapCodecQuartz在FMX.Canvas.iOS.pasAndroid: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 spcomm 调试串口解决总是在程序断开的时候才发送指令的问题
Delphi中实现hextostr函数和strtohex函数
Delphi superobject json操作类的基本用法
更多相关阅读请进入《Delphi》频道 >>