2016-07-26 36 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