【Swift / iOS】カメラアプリ作るよ!PhotosとAVFoundation / 多言語化対応などなどメモメモ

iOS

Photos と AVFoundationどちらが良いかな?


他用途で撮影するだけならPhotosでも良いようですね
今回はゴリゴリで作りたいのでAVFoundationで

特徴Photos + UIImagePickerControllerAVFoundation
簡単さ簡単(シンプルなアプリ向け)難しい(コード量が多い)
カスタマイズ性低い高い
高度な機能(リアルタイム)不可可能
学習コスト低い高い

Info.plistに追加が必要なのは?

<key>NSCameraUsageDescription</key>
<string>このアプリは写真を撮影するためにカメラを使用します。</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>撮影した写真をアルバムに保存するためにフォトライブラリにアクセスします。</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>写真を選択または編集するためにフォトライブラリにアクセスします。</string>

こんな感じで Info.plistに追加

多言語化したいので 日本語と英語

多言語化する

Project を開いて Infoのところで Localizations
+ Japanese ( ja )を追加

new file ファイル追加で String Catalog を選択

Localizableで作成

English と Japaneseがある状態

+で追加してEnglishとJapaneseを設定

こんにちわーるどを呼び出すには?

let helloString = NSLocalizedString("HelloWorld", comment: "")

という感じで。

Info.plistの説明文などを多言語化する

InfoPlist.stringsファイルの作成:

  • Xcodeのプロジェクトナビゲータで、プロジェクトのGroupを右クリックし、「New File」から「Strings File(Legacy)」を選択します。
  • ファイル名を「InfoPlist.strings」とします。

InfoPlistを選択して 右の Localization から

EnglishとJapaneseをチェック

こんな感じ

InfoPlist(English)

NSCameraUsageDescription = "This app requires access to the camera to take photos."

InfoPlist(Japanese)

NSCameraUsageDescription = "このアプリは写真を撮影するためにカメラを使用します。"

としました。

元のInfoの Privacy Camera Usage Descriptionのところは空欄にしました!

無事説明が出ました!

これだけで、カメラ起動と撮影はOKです^^

動画撮影は、音声録音も必要なので

NSMicrophoneUsageDescription も必要でした。

取得できるカメラデータ

データ項目メソッドまたはプロパティ説明
使用可能なデバイス一覧AVCaptureDevice.DiscoverySession利用可能なカメラデバイス一覧を取得。
解像度とフォーマットAVCaptureDevice.formatsサポートする解像度やフォーマットを取得。
フォーカスモードAVCaptureDevice.focusMode現在のフォーカスモード。
露出モードAVCaptureDevice.exposureMode現在の露出モード。
ズーム倍率AVCaptureDevice.videoZoomFactor現在のズーム倍率。
トーチとフラッシュの状態AVCaptureDevice.isTorchAvailable, hasFlashトーチとフラッシュの有無。
カメラの接続状態通知 (AVCaptureDeviceWasConnected)カメラが接続・切断された通知。

とりあえず全部見てみた

Device Name: 背面カメラ
Position: 1
Device Type: AVCaptureDeviceTypeBuiltInWideAngleCamera
Device Name: 前面カメラ
Position: 2
Device Type: AVCaptureDeviceTypeBuiltInWideAngleCamera
Format: <AVCaptureDeviceFormat: 0x281a00320 'vide'/'420v'  192x 144, { 3- 60 fps}, photo dims:{192x144,4032x3024}, fov:63.301, max zoom:189.00 (upscales @21.00), AF System:2, ISO:22.0-1760.0, SS:0.000020-0.333333>
Resolution: 192x144
Max Frame Rate: 60.0
Format: <AVCaptureDeviceFormat: 0x281a02d60 'vide'/'420f'  192x 144, { 3- 60 fps}, photo dims:{192x144,4032x3024}, fov:63.301, max zoom:189.00 (upscales @21.00), AF System:2, ISO:22.0-1760.0, SS:0.000020-0.333333, supports wide color>
// 中略
Format: <AVCaptureDeviceFormat: 0x281a03420 'vide'/'420f' 4032x3024, { 3- 30 fps}, photo dims:{4032x3024}, fov:63.301, max zoom:189.00 (upscales @1.00), AF System:2, ISO:22.0-2112.0, SS:0.000020-0.333333, supports wide color, supports highest photo quality>
Resolution: 4032x3024
Max Frame Rate: 30.0
Focus Mode: 2
Exposure Mode: 2
White Balance Mode: 2
Current Zoom Factor: 1.0
Max Zoom Factor: 16.0
Torch Available: true
Flash Available: true

縦横比率 – sessionPreset

sessionPreset | Apple Developer Documentation
A preset value that indicates the quality level or bit rate of the output.
AVCaptureSession.Preset | Apple Developer Documentation
Presets that define standard configurations for a capture session.

High Definition
qHD960x540: AVCaptureSession.Preset
hd1280x720: AVCaptureSession.Preset
hd1920x1080: AVCaptureSession.Preset
hd4K3840x2160: AVCaptureSession.Preset

VGA ( 4:3 レトロ感ありそう◯
qvga320x240: AVCaptureSession.Preset
vga640x480: AVCaptureSession.Preset

とりあえずこの辺を使おうかな?1200万画素のカメラがあればとりあえず、4K行けるので

表示は、AVCaptureVideoPreviewLayerで表示してそのサイズを同じ比率にすることで◎対応できました^^

しかし!フィルター適用でまた表示を変更。まあ良いのですが。

swiftUIの話。 StateObject x ObserveObject or Binding

正確な理解はなんとも親viewと子viewの変数(オブジェクト)の受け渡しで、

  • Binding 同期!子viewからの反映が必要か。英語でいうと拘束力ということで結びつきが強いイメージですね
  • ObesrveObject 観察対象、親viewの変更を子viewで観察して反映できるということ

のようですね。

EnvironmentObjectも良いですね、使っていると少しずつイメージが見えてきました?

画像の回転が難しい話。

swiftで画像の向きがおかしいと検索するとたくさん出てきます。
そしてよくわかりません>_<;

固定できればとりあえず良いのですが。

一気にやろうとしているので

写真撮影と動画撮影、動画プレビュー、動画からのフレーム切り出し

まあ写真撮影だけおかしい感じですが、回転は保存後に修正してください…と
今、縦横は長さでわかりますが、スクエアを採用すると…どっちがどっちかわからない。。。ん?困った。けど仕方ないか

そして前面カメラと背面カメラ

動画プレビュー AVCaptureVideoPreviewLayer でよいのか?

通常表示は AVCaptureVideoPreviewLayer で良いのですが
フィルターをかけたりすると使用できないので ImageViewに生成した画像を表示していきました。

ホワイトバランス

gainでホワイトバランスを設定。

その設定の 色温度と tint を取得できる

ホワイトバランスの設定だけでもある程度のベース色調整ができるので 動画のベースを検討

.photo / フラッシュ / キャプチャ

フラッシュにすると写真撮影が出来なくて(動画フレーム保存はもちろんできるがフラッシュは関係ない)

.on .auto のとき権限はカメラと同じなので

モードが .photoじゃないとだめと

.photoだと解像度がカメラ依存 ( 1200万画素あれば 4032×3024 )なので3840×2180 で4K切り抜きも可能
インカメラだと 500万画素?の6sでも2576 x 1932なのでまあまあかな
700万画素で 3088 x 2320
iPhone11からは1200万画素のようなので4K撮れるのかな

サイレントモードとして、フレームキャプチャは簡単だけど

お気軽にコメントください!

スパム対応のためコメント認証に数日かかることがありますが、お気軽にコメントいただけると嬉しいです^^

コメント

タイトルとURLをコピーしました