2016-07-26 35 views
2

Das Problem schrumpf:Verhindern von Firemonkey Foto

Ich habe eine mobile App in Firemonkey (XE 10.1 Berlin), die Bilder zu machen braucht. Das Problem ist, dass FireMonkey scheint meine Größe zu verkleinern, zumindest auf Android. Ich sehe das nicht nur in meiner eigenen App, sondern auch in der PhotoEditor Demo-App, die mit FireMonkey geliefert wird.

Wenn ich ein Foto mit meiner Kamera außerhalb FireMonkey mache, ist das Bild etwa 6-7 MB groß und 5184 x 2916 Pixel groß.
Wenn ich ein Bild mit meiner App oder mit der PhotoEditor-Demo-App mache, ist das Bild zwischen 140 und 180 kB und 365 x 648 Pixel groß.

Dies geschieht auf Android; Ich habe keinen Mac zur Hand, daher kann ich das momentan nicht auf einem iPad oder iPhone testen.

Was ich bisher gefunden habe:

Ich habe im Code Haltepunkte zu setzen, um herauszufinden, wo dies geschieht. Wenn der Ereignishandler OnDidFinishTaking aufgerufen wird, ist das empfangene Bild bereits geschrumpft. Das Ereignis wird von procedure TImageManagerAndroid.DidReceiveBitmap(const Sender: TObject; const M: TMessage); in FMX.MediaLibrary.Android.pas aufgerufen. In diesem Fall sehe ich die Zeile:

Photo := TBitmap.CreateFromFile(ImagePath); 

ImagePath bezieht sich auf eine JPG-Datei auf dem Gerät ist, dass bereits geschrumpft.

Suchen Sie weiter unten in dem Call-Stack, sehe ich einen Aufruf an

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

Dieses Verfahren in FMX.Platform.Android.pas lebt. Wenn ich auf die Erklärung für dieses Verfahren schaue, sehe ich, dass das Stichwort cdecl folgt, was bedeuten könnte, dass diese Methode aus nativem Android-Code aufgerufen wird.

Ich habe auch auf this tutorial geschaut. Hier wird die Prozedur IFMXCameraService.TakePhoto verwendet. Bemerkenswert ist diese nicht in der PhotoEditor Demo verwendet!
Es könnte eine Option sein, dies zu verwenden, da es einen Datensatz mit Parametern benötigt, die ein Feld RequiredResolution enthalten. Allerdings würde ich einen ähnlichen Ansatz wie bei der PhotoEditor-Demo bevorzugen.

Die Frage:
Wie kann ich Firemonkey schrumpft mein Foto zu verhindern?

Antwort

5

Ich habe festgestellt, dass FireMonkey eine Standard maximale Breite und Höhe für Fotos mit einem TTakeCustomPhotoAction hat. Wenn das Bild nicht zu dieser maximalen Größe passt, wird das Bild verkleinert. Der Schrumpfungsfaktor ist immer eine Potenz von 2, sodass FireMonkey das Bild halbiert, bis es passt.

Die TTakeCustomPhotoAction (die die direkte Basisklasse für TTakePhotoFromCameraAction ist) definiert zwei Eigenschaften, MaxWidth und MaxHeight. Aus irgendeinem Grund sind beide standardmäßig auf 1024 eingestellt.

Durch die Standardwerte zu einem viel höheren Wert, zum Beispiel 8192, können Sie ein Schrumpfen verhindern:

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

Diese Standardeigenschaften sind vom Typ Cardinal, dh sie einen Maximalwert von 4.294.967.295 haben (0xFFFFFFFF) - sie sind vorzeichenlose Werte von 8 Bytes.

+0

Hallo, gibt es eine Methode, um maxwidth und maxheight zu setzen, wenn Sie IFMXCameraService.TakePhoto zusammen mit TParamsPhotoQuery verwenden? – sandman