S.L*_*ica 3 delphi android 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);
Run Code Online (Sandbox Code Playgroud)
ImagePath 是指设备上已经缩小的.jpg文件.
进一步查看调用堆栈,我看到一个调用
procedure TFMXNativeActivityListener.onReceiveImagePath(ARequestCode: Integer; AFileName: JString);
Run Code Online (Sandbox Code Playgroud)
这个程序存在于FMX.Platform.Android.pas.在查看此过程的声明时,我发现它后跟关键字cdecl,这可能意味着从本机Android代码调用此方法.
我也看过这个教程.这里IFMXCameraService.TakePhoto使用该过程.值得注意的是,这个没有在PhotoEditor演示中使用!
它可能是一个使用它的选项,因为它采用包含RequiredResolution字段的参数的记录.但是,我更喜欢使用类似于PhotoEditor演示的方法.
问题:
如何防止FireMonkey缩小我的照片?
我发现FireMonkey有一个默认的最大宽度和高度用于拍摄的照片TTakeCustomPhotoAction.如果图像不符合最大尺寸,则图片会缩小.收缩的因素始终是2的幂,所以它似乎FireMonkey保持减半的影像,直到它适合.
的TTakeCustomPhotoAction(这是直接基类TTakePhotoFromCameraAction)定义了两个属性,MaxWidth和MaxHeight.出于某种原因,它们都默认为1024.
通过将默认值设置为更高的值,例如8192,可以防止收缩:
actTakePhotoFromCameraAction1.MaxWidth := Max(8192, actTakePhotoFromCameraAction1.MaxWidth);
actTakePhotoFromCameraAction1.MaxHeight := Max(8192, actTakePhotoFromCameraAction1.MaxHeight);
Run Code Online (Sandbox Code Playgroud)
这些默认属性是类型的Cardinal,这意味着它们的最大值为4.294.967.295(0xFFFFFFFF) - 它们是8字节的无符号值.
| 归档时间: |
|
| 查看次数: |
522 次 |
| 最近记录: |