防止FireMonkey缩小照片

时间:2016-07-26 11:11:46

标签: android delphi firemonkey delphi-10.1-berlin

问题:

我在FireMonkey(XE 10.1 Berlin)中有一个需要拍照的移动应用程序。问题是FireMonkey似乎将我的图片重新调整为更小,至少在Android上。 我不仅在我自己的应用程序中看到这种情况,而且在FireMonkey附带的PhotoEditor演示应用程序中也是如此。

当我使用FireMonkey外部的相机拍照时,图像大小约为6-7 Mb,尺寸为5184 x 2916像素。 当我使用我的应用程序或使用PhotoEditor演示应用程序拍照时,图像的大小介于140和180 kB之间,尺寸为365 x 648像素。

这在Android上发生;我没有方便的Mac,所以我暂时无法在iPad或iPhone上进行测试。

到目前为止我发现了什么:

我在代码中设置断点以找出发生的位置。调用OnDidFinishTaking事件处理程序时,它接收的图像已经缩小。

该事件是从procedure TImageManagerAndroid.DidReceiveBitmap(const Sender: TObject; const M: TMessage);中的FMX.MediaLibrary.Android.pas调用的。 在这种情况下,我看到了这一行:

Photo := TBitmap.CreateFromFile(ImagePath);

ImagePath指的是设备上已经缩小的.jpg文件。

进一步查看调用堆栈,我看到了对

的调用
procedure TFMXNativeActivityListener.onReceiveImagePath(ARequestCode: Integer; AFileName: JString);

此程序位于FMX.Platform.Android.pas。 在查看此过程的声明时,我发现后面跟着关键字cdecl,这可能意味着从本机Android代码调用此方法。

我也看过this tutorial。这里使用IFMXCameraService.TakePhoto过程。值得注意的是,PhotoEditor演示中使用的是! 它可能是一个使用它的选项,因为它采用包含RequiredResolution字段的参数的记录。但是,我更喜欢使用类似于PhotoEditor演示的方法。

问题:
如何防止FireMonkey缩小照片?

1 个答案:

答案 0 :(得分:6)

我发现FireMonkey对于使用TTakeCustomPhotoAction拍摄的照片有默认的最大宽度和高度。如果图像不符合最大尺寸,则图片会缩小。收缩因子总是2的幂,所以似乎FireMonkey保持图像减半,直到它适合。

TTakeCustomPhotoActionTTakePhotoFromCameraAction的直接基类)定义了两个属性MaxWidthMaxHeight。出于某种原因,它们都默认为1024。

通过将默认值设置为更高的值,例如8192,可以防止收缩:

actTakePhotoFromCameraAction1.MaxWidth := Max(8192, actTakePhotoFromCameraAction1.MaxWidth);
actTakePhotoFromCameraAction1.MaxHeight := Max(8192, actTakePhotoFromCameraAction1.MaxHeight);

这些默认属性的类型为Cardinal,这意味着它们的最大值为4.294.967.295(0xFFFFFFFF) - 它们是8字节的无符号值。