Prendre des photos en utilisant des interfaces FireMonkey
Remonter à Tutoriel mobile : Prendre une photo et la partager, et partager du texte (iOS et Android)
Ce tutoriel explique comment prendre et gérer des photos sur vos périphériques mobiles en utilisant les interfaces IFMXPhotoLibrary et IFMXCameraService.
Sommaire
Construction de l'interface utilisateur pour votre application
Déposez les composants suivants sur le Concepteur de fiches :
- Composant TToolBar
- Sur la barre d'outils, placez deux composants TSpeedButton. Vous allez utiliser ces boutons pour prendre des photos avec la caméra du périphérique et les sélectionner dans la bibliothèque de photos du périphérique.
- Dans l'inspecteur d'objets, spécifiez les propriétés suivantes pour ces boutons :
- Définissez la propriété StyleLookup sur cameratoolbuttonbordered et searchtoolbuttonbordered, respectivement.
- Définissez la propriété Align sur Left et Right, respectivement.
- Composant TImage
- Définissez la propriété Align sur Client.
Avant que vous définissiez le style ou la vue dans le Concepteur de fiches, la fiche de cette application exemple doit maintenant ressembler à l'écran suivant :
Remarque : Pour plus d'informations sur la sélection du style et des vues, voir Sélecteur de style et Utilisation des vues FireMonkey.
Prise d'une photo avec la caméra du périphérique
Pour prendre des photos avec une caméra de périphérique mobile, vous pouvez utiliser l'interface IFMXCameraService. Procédez comme suit :
-
Ouvrez l'éditeur de code et ajoutez les lignes suivantes à votre code si elles ne sont pas déjà présentes :
Delphi :
uses FMX.MediaLibrary, FMX.Platform, System.Messaging;
C++ :
#include <FMX.Platform.hpp> #include <FMX.MediaLibrary.hpp> #include <System.Messaging.hpp>
- Ajoutez l'en-tête de procédure suivant à la section private de la définition de fiche :
Delphi :
procedure DoDidFinish(Image: TBitmap); procedure DoMessageListener(const Sender: TObject; const M: TMessage);
C++ :
void __fastcall DoDidFinish(TBitmap *Image); void __fastcall DoMessageListener(const TObject *Sender, TMessage const *M);
-
Dans la section implementation, définissez DoDidFinish et DoMessageListener comme suit :
Delphi :
procedure TForm1.DoDidFinish(Image: TBitmap); begin Image1.Bitmap.Assign(Image); end; procedure TForm1.DoMessageListener(const Sender: TObject; const M: TMessage); begin if M is TMessageDidFinishTakingImageFromLibrary then Image1.Bitmap.Assign(TMessageDidFinishTakingImageFromLibrary(M).Value); end;
C++ :
void __fastcall TForm1::DoDidFinish(TBitmap *Image) { Image1->Bitmap->Assign(Image); } void __fastcall TForm1::DoMessageListener(const TObject *Sender, TMessage const *M) { TMessageDidFinishTakingImageFromLibrary const *v = dynamic_cast<TMessageDidFinishTakingImageFromLibrary const *>(M); if (v) { Image1->Bitmap->Assign(v->Value); } }
-
Sur le Concepteur de fiches, double-cliquez sur le bouton SpeedButton1 puis, dans l'éditeur de code, implémentez le gestionnaire d'événement onClick suivant :
Delphi :
procedure TForm1.SpeedButton1Click(Sender: TObject); var Service: IFMXCameraService; Params: TParamsPhotoQuery; begin if TPlatformServices.Current.SupportsPlatformService(IFMXCameraService, Service) then begin Params.Editable := True; // Specifies whether to save a picture to device Photo Library Params.NeedSaveToAlbum := True; Params.RequiredResolution := TSize.Create(640, 640); Params.OnDidFinishTaking := DoDidFinish; Service.TakePhoto(SpeedButton1, Params); end else ShowMessage('This device does not support the camera service'); end;
C++ :
void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { _di_IFMXCameraService service; TParamsPhotoQuery params; if (TPlatformServices::Current->SupportsPlatformService (__uuidof(IFMXCameraService)) && (service = TPlatformServices::Current->GetPlatformService (__uuidof(IFMXCameraService)))) { params.Editable = true; // Specifies whether to save a picture to device Photo Library params.NeedSaveToAlbum = true; params.RequiredResolution = TSize(640, 640); params.OnDidFinishTaking = DoDidFinish; service->TakePhoto(SpeedButton1, params); } else { ShowMessage("This device does not support the camera service"); } }
Exécution de l'application
Exécutez l'application sur votre périphérique mobile en appuyant sur F9 ou en choisissant Exécuter > Exécuter. Pour activer la caméra du périphérique, appuyez sur l'icône de la caméra sur la barre d'outils de votre application :
iOS | Android |
---|---|
Pour utiliser cette photo :
- Sur les périphériques Android, cliquez sur OK.
- Sur les périphériques iOS, cliquez sur Use.
Enregistrement d'une photo dans la bibliothèque de photos du périphérique
Pour que votre application enregistre automatiquement les photos prises par la caméra du périphérique dans la bibliothèque de photos de ce périphérique, définissez le champ NeedSaveToAlbum du second paramètre de la méthode TakePhoto sur True
(voir les extraits de code à l'étape 4 de la procédure ci-dessus).
Votre application enregistre les photos dans un album au sein de la bibliothèque de photos du périphérique. Le nom de l'album dépend du système d'exploitation du périphérique, comme indiqué ci-dessous :
Version du système d'exploitation | Nom de l'album |
---|---|
iOS | Pellicule |
Android | Caméra |
Sélection d'une photo dans la bibliothèque de photos du périphérique
FireMonkey définit l'interface IFMXTakenImageService qui vous permet de sélectionner une photo à partir de la bibliothèque de photos du périphérique.
Pour que votre application sélectionne une photo à partir de la bibliothèque de photos du périphérique, procédez comme suit :
-
Sur le Concepteur de fiches, double-cliquez sur le bouton SpeedButton2 (afin de choisir une photo), puis dans l'éditeur de code, implémentez le gestionnaire d'événement onClick suivant :
Delphi :
procedure TForm1.SpeedButton2Click(Sender: TObject); var ImageService: IFMXTakenImageService; Params: TParamsPhotoQuery; begin if TPlatformServices.Current.SupportsPlatformService(IFMXTakenImageService, IInterface(ImageService)) then begin Params.RequiredResolution := TSize.Create(640, 640); Params.OnDidFinishTaking := DoDidFinish; ImageService.TakeImageFromLibrary(SpeedButton2, Params); end; end;
C++ :
void __fastcall TForm1::SpeedButton2Click(TObject *Sender) { _di_IFMXTakenImageService service; TParamsPhotoQuery params; if (TPlatformServices::Current->SupportsPlatformService (__uuidof(IFMXTakenImageService)) && (service = TPlatformServices::Current->GetPlatformService (__uuidof(IFMXTakenImageService)))) { params.RequiredResolution = TSize(640, 640); params.OnDidFinishTaking = DoDidFinish; service->TakeImageFromLibrary(SpeedButton2, params); } else { ShowMessage("This device does not support the photo library service"); } }
-
Dans la vue Structure, sélectionnez Form1, puis dans l'inspecteur d'objets, ouvrez l'onglet Evénements, double-cliquez sur un champ vide en regard de OnCreate, et implémentez le gestionnaire d'événement onFormCreate suivant :
Delphi :
procedure TForm1.FormCreate(Sender: TObject); begin TMessageManager.DefaultManager.SubscribeToMessage(TMessageDidFinishTakingImageFromLibrary, DoMessageListener); end;
C++ :
void __fastcall TForm1::FormCreate(TObject *Sender) { TMessageManager::DefaultManager->SubscribeToMessage(__classid(TMessageDidFinishTakingImageFromLibrary), TMessageListenerMethod(&DoMessageListener)); }
- Compilez et exécutez votre application. Pour sélectionner une photo, appuyez sur le bouton de recherche, puis sélectionnez la photo de votre choix dans la bibliothèque de photos du périphérique.
iOS Android Remarque : Sur les iPad, l'application affiche des miniatures des photos dans une fenêtre popup en regard de l'élément de contrôle spécifié dans le premier paramètre de la méthode TakeImageFromLibrary. Dans notre projet exemple, SpeedButton2 se réfère au bouton de recherche.