3

问题:

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

当我在 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);in调用的FMX.MediaLibrary.Android.pas。在这种情况下,我看到这条线:

Photo := TBitmap.CreateFromFile(ImagePath);

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

再往下看调用堆栈,我看到一个调用

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

这个程序存在于FMX.Platform.Android.pas. 在查看此过程的声明时,我发现它后面跟着关键字cdecl,这可能暗示此方法是从原生 Android 代码调用的。

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

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

4

1 回答 1

7

我发现 FireMonkey 对于使用TTakeCustomPhotoAction. 如果图像不适合该最大尺寸,则图片会缩小。收缩因子始终是 2 的幂,因此 FireMonkey 似乎不断将图像减半,直到合适为止。

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

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

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

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

于 2016-07-26T11:11:46.460 回答