防止 FireMonkey 缩小照片。

3
问题:
我在FireMonkey(XE 10.1 Berlin)中有一个移动应用程序,需要拍照。问题是,在Android上,FireMonkey似乎会将我的图片调整为更小的尺寸。我不仅在自己的应用程序中看到这种情况,还在FireMonkey附带的PhotoEditor Demo应用程序中看到。
当我在FireMonkey之外使用相机拍照时,图像大约为6-7 Mb,大小为5184 x 2916像素。 当我使用我的应用程序或使用PhotoEditor演示应用程序拍摄照片时,图像的大小在140到180 kB之间,大小为365 x 648像素。
这种情况发生在Android上;我目前没有Mac可用,因此无法在iPad或iPhone上测试它。
到目前为止,我找到的内容:
我设置了断点来查找此情况发生的位置。当调用OnDidFinishTaking事件处理程序时,它接收到的图像已经缩小。
该事件由FMX.MediaLibrary.Android.pas中的procedure TImageManagerAndroid.DidReceiveBitmap(const Sender: TObject; const M: TMessage);调用。 在此事件中,我看到以下行:
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缩小我的照片?
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字节的无符号值。


你好,如果你使用IFMXCameraService.TakePhoto和TParamsPhotoQuery一起,有没有一种方法来设置最大宽度和最大高度? - sandman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接