FireMonkey インターフェイスを使用して写真を撮る

提供: Appmethod Topics
移動先: 案内検索

モバイル チュートリアル:写真を撮って共有する、テキストを共有する(iOS および Android) への移動


このチュートリアルでは、IFMXPhotoLibrary および IFMXCameraService インターフェイスを使用して、モバイル デバイスで写真を撮って処理する方法を説明します。

アプリケーションのユーザー インターフェイスの構築

フォーム デザイナに以下のコンポーネントをドロップします。

  • TToolBar コンポーネント
    • このツールバー上に 2 つの TSpeedButton コンポーネントを配置します。このボタンを使用して、デバイスのカメラで写真を撮ったり、デバイスのフォト ライブラリから写真を選択します。
    • [オブジェクト インスペクタ]で、ボタンの以下のプロパティを指定します。
      • StyleLookup プロパティを、それぞれ cameratoolbuttonborderedsearchtoolbuttonbordered に設定します。
      • Align プロパティを、それぞれ LeftRight に設定します。
  • TImage コンポーネント
    • Align プロパティを Client に設定します。

このサンプル アプリケーションのフォームは、次の図のようになります。ここではまだ、フォーム デザイナ[スタイル][ビュー]は設定していません。

CameraAppUIElements1.png

メモ: [スタイル][ビュー]の選択についての詳細は、「スタイル セレクタ」および「FireMonkey ビューの使用」を参照してください。

デバイス カメラでの写真の撮影

モバイル デバイスのカメラで写真を撮るには、IFMXCameraService インターフェイスを使用します。手順は以下のとおりです。

  1. コード エディタを開き、以下の行がコードに含まれていない場合には追加します。
    Object Pascal の場合:
    uses
      FMX.MediaLibrary, FMX.Platform, System.Messaging;
    
    C++ の場合:
    #include <FMX.Platform.hpp>
    #include <FMX.MediaLibrary.hpp>
    #include <System.Messaging.hpp>
    
  2. フォーム定義の private セクションに次の手続きヘッダーを追加します。
    Object Pascal の場合:
     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);
    
  3. implementation セクションで、DoDidFinishDoMessageListener を次のように定義します。
    Object Pascal の場合:
     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);
    	}
    }
    
  4. フォーム デザイナSpeedButton1 ボタンをダブルクリックし、コード エディタonClick イベント ハンドラを次のように実装します。
    Object Pascal の場合:
     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");
    	}
    }
    

アプリケーションを実行する

F9 を押すか[実行|実行]を選択して、モバイル デバイス上でアプリケーションを実行します。デバイスのカメラを起動するには、アプリケーションのツールバーにあるカメラ アイコンをタップします。

iOS Android

TakePicture IOS.png

TakePicture Android.png

この写真を使用するには:

  • Android デバイスでは[OK]をクリックします。
  • iOS デバイスでは[Use]をクリックします。

デバイスのフォト ライブラリに写真を保存する

デバイス カメラで撮った写真をアプリケーションで自動的にデバイスのフォト ライブラリに保存する場合には、TakePhoto メソッドの第2パラメータの NeedSaveToAlbumTrue に設定します(上記手順のステップ 4のコード スニペットを参照)。

そうすると、アプリケーションはデバイスのフォト ライブラリ内のアルバムに写真を保存します。このアルバムの名前は、デバイスのオペレーティング システムによって異なります。

OS バージョン   アルバム名  
iOS 7.X Camera Roll
iOS 8.X Today
Android Camera

デバイスのフォト ライブラリの写真の選択

FireMonkey で定義されている IFMXTakenImageService インターフェイスを使用すると、デバイスのフォト ライブラリから写真を選択することができます。

アプリケーションでデバイスのフォト ライブラリから写真を選択する手順は以下のとおりです。

  1. フォーム デザイナSpeedButton2 ボタン(写真選択用のボタン)をダブルクリックし、コード エディタonClick イベント ハンドラを次のように実装します。
    Object Pascal の場合:
    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");
    	}
    }
    
  2. [構造]ビューForm1 を選択し、[オブジェクト インスペクタ][イベント]タブを開いて、OnCreate の隣の空のフィールドをダブルクリックします。その後、onFormCreate イベント ハンドラを次のように実装します。
    Object Pascal の場合:
     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));
    }
    
  3. アプリケーションをコンパイルして実行します。写真を選択するには、検索ボタンをタップし、デバイスのフォト ライブラリから目的の写真を選択します。
    iOS Android

    TakePhotoFromLibraryAction.PNG

    Android SelectfromLibrary.png

    メモ: iPad デバイスでは、TakeImageFromLibrary メソッドの最初のパラメータで指定したコントロール要素の隣にポップアップ ウィンドウが開き、サムネイル写真が表示されます。このサンプル プロジェクトでは、SpeedButton2 が検索ボタンです。

関連項目