2016-07-26 34 views
2

问题预防FireMonkey:从萎缩照片

我在FireMonkey移动应用(XE 10.1柏林),需要拍照。问题在于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);调用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缩小我的照片?

回答

5

我发现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字节的无符号值。

+0

嗨有没有一种方法来设置maxwidth和maxheight如果您使用IFAMXCameraService.TakePhoto与TParamsPhotoQuery? – sandman