LASSIC Media らしくメディア
アプリの写真選択・画像処理をPHPickerで実装、外注
LASSIC IT事業部|元請(プライムベンダー)としてシステム保守・運用を受託
この記事のポイント
- スマホアプリで写真を選ばせて画像処理する実装には、iOSのPHPickerViewControllerとAndroidのPhoto Pickerという専用の仕組みがあります。
- どちらもユーザーが選んだ写真だけにアクセスできる設計で、フォトライブラリ全体への権限を求めない点が特徴です。
- 選択後の画像処理の実装範囲や対応OSの違いによって、内製と外注の判断が分かれます。
目次
- アプリの写真選択・画像処理とは、権限を絞ったPHPicker/Photo Pickerの仕組み
- iOSのPHPickerViewController——ライブラリ権限なしで写真を選ばせる仕組み
- AndroidのPhoto Picker——標準搭載と過去バージョンへのバックポート
- PHPickerとPhoto Pickerの違い——対応OS・権限・選択数の比較
- 選択した写真の画像処理——リサイズ・圧縮・切り抜きの実装ポイント
- 実装で見落としやすい落とし穴——HEIC形式・EXIF回転・一時アクセス権限
- 内製と外注の分かれ目——画像処理実装の対応範囲で判断する
- まとめ:写真選択・画像処理の実装で押さえる3つの判断軸
- よくある質問
アプリの写真選択・画像処理とは、権限を絞ったPHPicker/Photo Pickerの仕組み
アプリの写真選択・画像処理のPHPicker実装とは、フォトライブラリ全体へのアクセス権限を求めずに、ユーザーが選んだ写真だけを取得してリサイズや切り抜きなどの加工を行う実装方式を指します*1*4。iOSではPHPickerViewController、AndroidではPhoto Pickerという専用のUIコンポーネントが提供されています*1*4。
プロフィール画像の設定や投稿機能への写真添付など、多くのアプリで写真選択は避けられない機能です。選び方と加工の実装を誤ると、権限周りの審査で指摘を受けたり、メモリ不足でアプリが落ちたりする恐れがあります。
iOS・Androidともに、選択専用の仕組みを使えばフォトライブラリ全体への権限を要求せずに済みます*2*4。この権限設計を正しく理解したうえで、選択後の画像処理まで含めて実装範囲を見積もることが実務では大切です。
iOSのPHPickerViewController——ライブラリ権限なしで写真を選ばせる仕組み
UIImagePickerControllerとの違い
PHPickerViewControllerは、PhotoKit(Appleのフォトライブラリ管理フレームワーク)が提供するUIコンポーネントで、iOS14以降で利用できます*1。旧来のUIImagePickerControllerの代替として位置づけられ、大きなRAW画像やパノラマ画像でも安定して扱える点が特徴です*1。
大きな違いは権限モデルにあります。PHPickerViewControllerはアプリと別プロセスで動作するため、フォトライブラリの表示そのものにユーザー権限が要りません*2。アプリが読み取れるのは、ユーザーが実際に選択した写真だけに限られます*2。
PHPickerConfigurationで選択数を制御する
選択数の上限は、PHPickerConfigurationのselectionLimitプロパティで指定します*3。プロフィール画像のように1枚だけ選ばせたい場合は1を、複数枚を扱うアルバム機能では任意の枚数を設定できます*3。
選択結果はPHPickerResultの配列として返り、各結果からNSItemProviderを介して画像データを取得する流れです*1。取得処理は非同期で行われるため、大きな画像を選んだ場合の読み込み待ちを画面上で示す設計も欠かせません。
AndroidのPhoto Picker——標準搭載と過去バージョンへのバックポート
Android11以降の標準搭載とGoogle Play開発者サービスでの提供
Android Photo Pickerは、Android11(APIレベル30)以降でGoogleシステムアップデートの対象になっている端末に標準搭載されています*4。Android4.4からAndroid10までの端末や、Android11・12を搭載するAndroid Go端末でも、Google Play開発者サービス経由でバックポート版を利用できます*4。
Photo Pickerの狙いは、アプリに写真・動画ライブラリ全体への読み取り権限(READ_MEDIA_IMAGES等)を渡さずに、選択した項目だけへのアクセスを許可することです*4。この設計はiOSのPHPickerViewControllerと共通する考え方だといえます*2*4。
PickVisualMedia/PickMultipleVisualMediaでの実装
実装にはAndroidXのActivity Result APIを使い、単数選択にはPickVisualMedia、複数選択にはPickMultipleVisualMediaというActivity Result Contractを利用します*4。複数選択では、コンストラクタに渡す引数で選択可能な上限枚数を指定できます*4。
端末やOSバージョンによって選択可能枚数の上限が異なる場合があり、getPickImagesMaxLimitメソッドで実際の上限を取得できます*4。上限を超えた枚数を要求する実装は避ける必要があります。
PHPickerとPhoto Pickerの違い——対応OS・権限・選択数の比較
両者は設計思想が近い一方、対応バージョンや実装APIには違いがあります。整理すると次の通りです。
| 項目 | iOS PHPicker | Android Photo Picker |
|---|---|---|
| 標準搭載バージョン | iOS14以降*1 | Android11(APIレベル30)以降*4 |
| 旧バージョンへの対応 | iOS14未満は非対応。UIImagePickerControllerを使用*1 | Android4.4〜10はGoogle Play開発者サービスでバックポート*4 |
| 権限の考え方 | 別プロセスで動作し選択項目のみ読み取り可*2 | 選択項目のみアクセス許可。READ_MEDIA_IMAGES等は不要*4 |
| 選択数の指定 | PHPickerConfiguration.selectionLimit*3 | PickMultipleVisualMediaの引数・getPickImagesMaxLimit*4 |
| 実装API | PhotoKit / PHPickerViewController*1 | AndroidX Activity Result API*4 |
比較して分かるのは、いずれもアプリ側にフォトライブラリ全体の権限を持たせない設計を採っている点です*2*4。対応OSの下限やAPIの呼び方はプラットフォームごとに異なるため、両OS対応のアプリでは別々の実装知識が必要になります。
選択した写真の画像処理——リサイズ・圧縮・切り抜きの実装ポイント
iOSの画像処理——ImageI/OとCore Imageでのリサイズ・切り抜き
PHPickerResultから取得した画像は、そのままアップロードすると容量が大きく、通信や保存領域を圧迫します。ImageI/O(画像の読み込み・書き出しを扱うApple公式フレームワーク)を使うと、元画像の全体を展開せずに縮小サムネイルを生成できます。
切り抜きや回転などの加工には、画像フィルタ処理フレームワークのCore Imageを使う実装が一般的です。フィルタ処理は端末のGPUを使うため、複数枚を連続処理する画面でも操作感を保ちやすくなります。
Androidの画像処理——BitmapとContentResolverでのメモリ管理
AndroidではPhoto Pickerが返すURIを、コンテンツプロバイダ経由でデータへアクセスする仕組みのContentResolverを介して読み込みます。元解像度のままBitmapに展開すると、高解像度の写真ではメモリ不足でアプリが強制終了する要因になります。
そのため、表示用途に応じてBitmapFactory.Optionsで縮小率を指定してから展開する実装が必要です。バックグラウンドでの圧縮処理には、画面遷移後も処理を続けられるWorkManagerの利用が実務上の選択肢になります。
リサイズを行わずに原寸のまま扱うと、通信量の増加だけでなく、一覧画面でのスクロール時にカクつきが生じたり、メモリ不足でアプリが落ちたりする恐れがあります。EXIF(撮影時の向き・位置情報などを画像に埋め込む規格)の回転情報を無視して保存すると、横向きで撮影した写真が縦のまま表示される不具合にもつながります。
実装で見落としやすい落とし穴——HEIC形式・EXIF回転・一時アクセス権限
iOSのカメラで撮影した写真の既定フォーマットはHEIC(High Efficiency Image Coding。JPEGより高い圧縮率を持つ画像形式)です*1。サーバー側や他プラットフォームがHEICに対応していない場合、アップロード前にJPEGなどへ変換する処理が欠かせません。
EXIFの回転情報を反映せずにサムネイルを生成すると、向きが崩れた画像が保存される問題が起こりやすくなります。ImageI/OやCore Imageで加工する際は、回転情報を読み取ったうえで処理する実装が求められます。
Androidでは、Photo Pickerで取得したURIへのアクセス権限は一時的なものです。プロセスが終了した後も同じ写真を参照したい場合は、選択のタイミングでアプリ側のストレージへコピーしておく設計が必要になります*4。
この作業を内製で担うには、iOS・Android双方の画像フレームワークの仕様に加えて、メモリ管理やファイル形式変換など、OSごとに異なる知識が要ります。単純な画面遷移の実装と比べて、事前に検証すべき組み合わせが多い点が特徴です。
内製と外注の分かれ目——画像処理実装の対応範囲で判断する
写真選択自体はPHPickerViewControllerやPhoto Pickerを呼び出すだけで実装できるため、単純な1枚選択の機能なら自社で対応できる場合もあります*1*4。判断が分かれるのは、複数枚選択・リサイズ・圧縮・形式変換を組み合わせた画像処理パイプラインを構築する場面です。
専門パートナーに委託する場合は、iOS・Android両方の実装経験に加えて、アップロード後のサーバー側処理まで含めて依頼できるかを確認します。内製では、既存の開発担当者が通常業務と並行して対応することになり、OS間の差異を検証する時間が限られる場合があります。
。写真選択・画像処理の実装範囲や対応OSの組み合わせによって、必要な工数は変わってきます。現状の要件を整理したうえで、内製・外注の切り分けを検討することが実務的です。
まとめ:写真選択・画像処理の実装で押さえる3つの判断軸
本稿ではアプリの写真選択・画像処理について、PHPickerViewControllerとPhoto Pickerの公式仕様をもとに整理しました。要点は3つに集約できます。第一に、両者ともフォトライブラリ全体への権限を求めず、選択した写真だけにアクセスする設計です*2*4。第二に、選択後のリサイズ・圧縮・形式変換にはOSごとに異なる画像処理フレームワークの知識が必要です。第三に、複数枚選択やOS間の差異を含む実装範囲の広さが、内製と外注の判断材料になります。
よくある質問
PHPickerで選んだ写真は、アプリからフォトライブラリ全体が見えるようになりますか。
いいえ、見えるようになりません。PHPickerViewControllerは別プロセスで動作し、アプリが読み取れるのはユーザーが実際に選択した写真だけです*2。フォトライブラリ全体への権限を求める設計ではありません。
Android Photo Pickerは古いAndroidバージョンでも使えますか。
Android4.4からAndroid10までの端末でも、Google Play開発者サービス経由でバックポート版のPhoto Pickerを利用できます*4。Android11以降の端末は、Googleシステムアップデートを通じて標準搭載されています*4。
選択できる写真の枚数に上限はありますか。
iOSではPHPickerConfigurationのselectionLimitで枚数を指定します*3。Androidでは選択可能な上限枚数がgetPickImagesMaxLimitで取得でき、端末やOSバージョンによって上限が異なる場合があります*4。
選択した写真はそのままアップロードしてよいのでしょうか。
原寸のままアップロードすると通信量や保存領域を圧迫し、メモリ不足の要因にもなります。用途に応じたリサイズ・圧縮を行ってから使う実装が実務上は望ましいといえます。
写真選択・画像処理の実装を外注する場合、何を確認すればよいですか。
対応するiOS・Androidのバージョン範囲、選択可能な枚数や形式、画像処理の実装範囲(リサイズ・圧縮・形式変換)をまず確認します。サーバー側のアップロード処理まで含めて依頼できるかも、契約前にすり合わせておくことが大切です。
著者:テレリモ総研編集部 鈴木 亮佑
ご不明な点はお問い合わせフォームからもご連絡いただけます。
- *1 出典:Apple「PHPickerViewController」(Apple Developer Documentation・PhotoKit)(https://developer.apple.com/documentation/photokit/phpickerviewcontroller)
- *2 出典:Apple「Selecting Photos and Videos in iOS」(Apple Developer Documentation)(https://developer.apple.com/documentation/photokit/selecting_photos_and_videos_in_ios)
- *3 出典:Apple「PHPickerConfiguration」(Apple Developer Documentation・PhotoKit)(https://developer.apple.com/documentation/photokit/phpickerconfiguration)
- *4 出典:Android Developers「Select photos and videos with the photo picker」(https://developer.android.com/training/data-storage/shared/photopicker)