作者:v05736708 | 来源:互联网 | 2023-06-07 13:30
在 VCL 底下,把一个 Bitmap 变成 JPEG,是采用将 TBitmap 的内容赋值给 TJpegImage 的方式。
在 FireMonkey 底下该怎么做?
看到论坛有人提问,上网查了一下资料,自己写代码测试了一下。以下代码测试通过:
uses FMX.Surfaces;procedure TForm1.Button1Click(Sender: TObject);
varBmp: TBitmap;Src, Trg: TRectF;NewWidth, NewHeight: Integer;AStream: TFileStream;Surf: TBitmapSurface;
beginif OpenDialog1.Execute thenbeginImage1.Bitmap.LoadFromFile(OpenDialog1.FileName);Src := RectF(0, 0, Image1.Bitmap.Width, Image1.Bitmap.Height);//这里缩小一半NewWidth := Trunc(Image1.Bitmap.Width / 2);NewHeight := Trunc(Image1.Bitmap.Height / 2);Trg := RectF(0, 0, NewWidth, NewHeight);Bmp := TBitmap.Create;tryBmp.Width := NewWidth;Bmp.Height := NewHeight;Bmp.Canvas.BeginScene;tryBmp.Canvas.DrawBitmap(Image1.Bitmap, Src, Trg, 1)finallyBmp.Canvas.EndScene;end;Image2.Bitmap.Assign(Bmp);// 保存的文件名带 jpg ,自动压缩为 JPGBmp.SaveToFile('D:\testAAA.jpg');//保存到 Stream 看看Surf := TBitmapSurface.Create;AStream := TFileStream.Create('D:\testAAABB.jpg', fmCreate);trySurf.Assign(Bmp);//这个方法,通过字符串 .jpg 指定它输出时编码为 jpg,测试通过。TBitmapCodecManager.SaveToStream(AStream, Surf, '.jpg', nil);finallyAStream.Free;Surf.Free;end;finallyBmp.Free;end;end;
end
总结:
1. 缩放,在 VCL 底下采用 Canvas.StretchDraw 方法。这里是直接 DrawBitmap 就可以。
2. 输出为 JPEG 文件,直接使用 TBitmap.SaveToFile,它自动根据文件名的后缀决定如何编码。因此也可以输出为 PNG 文件。
3. 输出为 Stream,TBitmap.SaveToStream 没找到设置输出格式的参数。稍微麻烦一点,采用 TBitmapCodecManager.SaveToStream 方法,给出图片格式参数字符串。需要注意到是,jpg 前面必须加上小点。如果没加,也不会报错,但实际输出的是 Bitmpa 图片的内容而不是编码后的 JPEG 的内容。