iPhoneで使える写真・ビデオ撮影のいろんな機能を紹介します。

> この記事は、「 [iPhone Advent Calendar 2013](http://www.adventar.org/calendars/144) 」の10日目の記事です。

@hkato193 です。12/20に出る「 [上を目指すプログラマーのためのiPhoneアプリ開発テクニック iOS 7編](http://www.amazon.co.jp/gp/product/4844335200?ie=UTF8&camp=1207&creative=8411&creativeASIN=4844335200&linkCode=shr&tag=ktkt02-22&qid=1385912013&sr=8-1) 」が楽しみです（宣伝）。

それはともかく、今回はiPhoneに搭載されているカメラについて、アプリ開発をしている立場から見て「こんなこともできるよ」「それはどうやっても無理」といったできること・できないことを紹介します。

iOS 7が使えるようになってはや3ヶ月が経ちますが、多くのカメラアプリはまだiPhoneの（iOS 7の）本当の実力を発揮していません。ですので、ここで紹介する機能をお気に入りのアプリが持っていなければ、ぜひ以下の説明を根拠に開発者にリクエストしてみましょう。
（ブーメランになって刺さりそうな気もしますが気のせいですね！）

> 以降の説明はiOS 7が対象ですが、機種によっては動作しない機能もあります。大きく分けると、iPhone 5sがほぼ全機能が使えますが、iPhone 5c/iPhone 5は一部が使えず、iPhone 4s/iPhone 4はさらに多くが使えません。あと、前面カメラはほとんどの機能が使えないので注意です。
>
> また、本記事は「 [iPhone Advent Calendar 2013](http://www.adventar.org/calendars/144) 」の空気に合わせるため、技術的に深く掘り下げずユーザー視点で記事を書いています。広く浅い内容にしていること、あらかじめご了承ください。

# 写真撮影で使える機能

はじめに、写真を撮影するときに使える機能を紹介します。

## フォーカス・露出・ホワイトバランス調整

iPhoneはフォーカス方式として「指定した場所へのオートフォーカス＆フォーカスロック」「コンティニュアスフォーカス」の2種類が使えます。それぞれデジカメと同じで、ピントを合わせた後は同じ場所にとどめておく方式と、フォーカス動作を常に効かせて、動く被写体でもピントを合わせ続ける方式です。
画面をタップして、その場所にピントを合わせることもできます。

ただし、ピントの合った場所までの距離は分かりません。デジカメの種類によっては「○○mでピントが合いましたよ」と、フォーカスした場所までの距離を教えてくれるものもありますが、そうした機能はiPhoneでは実現できません。

```objc
AVCaptureDevice
@property(nonatomic) AVCaptureFocusMode focusMode
```

露出制御やホワイトバランスもフォーカスと同様、「指定した場所に露出/ホワイトバランスを合わせる」「露出・ホワイトバランス制御を常に動かしておく」の2種類の方式が使えます。
露出やホワイトバランスの位置は、それぞれ別に設定できるので、「フォーカスと露出を別々に設定する」なんてこともできます。

```objc
AVCaptureDevice
@property(nonatomic) AVCaptureExposureMode exposureMode // 露出
@property(nonatomic) AVCaptureWhiteBalanceMode whiteBalanceMode // ホワイトバランス
```

## 手ぶれ補正（iPhone 5sのみ）

iPhone 5sだけ、写真撮影のときも手ぶれ補正を有効にできます。それ以外のカメラはビデオ撮影の手ぶれ補正はできますが写真撮影ではできません。iPhone 5sは明るいレンズを載せているので、手ぶれ補正と合わせると、さらに暗い場面に強くなります。

```objc
AVCaptureStillImageOutput
@property(nonatomic) BOOL automaticallyEnablesStillImageStabilizationWhenAvailable
// ※ sessionPresetがAVCaptureSessionPresetPhoto相当であること
```

iPhone 5sのカメラ、強力すぎますね。

## バースト撮影…

iPhone 5sで、iOS標準のカメラアプリにて撮影ボタンを長押しすると、1秒間に10枚の早さで撮影する「バースト撮影モード」に切り替わり、雪崩のように写真を撮れます。しかも、撮影した写真をこれまたiOS標準の写真アプリで見ると、沢山撮った写真の中からお気に入りの1枚を取り出して保存できます。決定的なタイミングを逃さない、素敵な機能です。

・・・残念ながら、標準のカメラ・写真アプリ以外で、このバーストモードで撮影した写真を標準アプリのように取り扱うことは **できません**。アルバムアプリや写真アプリの開発者に「バースト撮影したい、バースト撮影した写真をちゃんと取り扱ってほしい」と言ってもどうにもならないので、ここは素直にiOS 8を待ちましょう。

# ムービー撮影で使える機能
続いて、ムービー（動画）を撮影するときに使える機能です。

## 撮影サイズの制限

iPhoneで撮影できるムービーの最大サイズは1920x1080までです。写真は800万画素（iPhone 5シリーズの場合）を使った撮影ができますが、動画は最大でも1920x1080の24(30)fps（frames per sec/1秒当たりに描かれる画面の枚数。大きいほど滑らかに動く）までです。

iPhone 5以降やiPad mini以降の機種だと、背面カメラで60fps、iPhone 5sだと120fpsで撮影できます。ただしこのときはサイズの最大値が1280x720までになります。

```objc
AVCaptureDevice
@property(nonatomic, retain) AVCaptureDeviceFormat *activeFormat
```

少し技術的な話になりますが、iPhone 5s/iPad Air/iPad mini retinaなどのA7プロセッサを載せた機種はH.264ビデオの「ハイプロファイル：レベル4.2」を扱えるので、フルHDで60fpsな動画でも再生できます。

##手ぶれ補正撮影

写真撮影での手ぶれ補正はiPhone 5sだけですが、動画撮影であればiPhone 4sから対応しています。とはいえ、期待するほどの効果はないですが。あと、手ぶれ補正は撮影中のプレビュー画面に影響を与えないので、画面ではブレブレだけれどムービーを見たらそれほどでもなかった、というのはあります。

```objc
AVCaptureConnection
@property(nonatomic) BOOL enablesVideoStabilizationWhenAvailable
```

##低光量下での明るさブースト

暗い場面を撮影するときに、カメラの複数のピクセルを使って明るさを補正する機能があります。幸いなことに、60fpsや120fpsでの撮影時はこの機能が使えます。

開発者には「暗い場所での移りが悪いです」と行っておけば対応してくれると思います（保証はしませんが）。

```objc
AVCaptureDevice
@property(nonatomic) BOOL automaticallyEnablesLowLightBoostWhenAvailable
```

##ズーム速度の調節

ハンディカムのようなビデオカメラでは、ズームレバーがアナログスイッチになっていて、動かした量でゆっくりズームさせたり、すばやくズームさせたりできます。同じことがiPhoneでもできるようになっていて、ズーム率をなめらかに変更して、自然なズーミング動作が実現できます。

```objc
AVCaptureDevice
- (void)rampToVideoZoomFactor:(CGFloat)factor withRate:(float)rate
```

##スマートズーム

[この説明](http://kotobank.jp/word/スマートズーム)にあるような、撮影時にセンサー画素に余裕があるときに、その余裕をズームに活かした「劣化しないデジタルズーム」も、撮影サイズ次第で実現できます。

```objc
// AVCaptureDeviceFormat
// @property(nonatomic, readonly) CGFloat videoZoomFactorUpscaleThreshold
// が示す値以下でズーム
@property(nonatomic) CGFloat videoZoomFactor
- (void)rampToVideoZoomFactor:(CGFloat)factor withRate:(float)rate
```

##スムーズオートフォーカス

iPhoneは動画でもオートフォーカスを効かせられるのですが、このときピントがあちこちを行ったり来たり、あるいは急にピントが合ったりすると、再生したときに見にくいムービーになってしまいます。そこで、ピントを合わせ始めてもすぐにピントが合うのでは無く、ゆっくりピントを合わせることで滑らかに注目ポイントを切り換えるよう、ピントの合う速度をスムーズにすることができます。

```objc
AVCaptureDevice
@property(nonatomic, getter=isSmoothAutoFocusEnabled) BOOL smoothAutoFocusEnabled
```

## ライトの明るさ調整

あまり知られていないですが、iPhoneのライトは明るさを変更できます。iPhone 5だとオフ〜100％までを５段階くらいで切り換えられます。
（実際のところ、大して変わらないのですが…）

```objc
AVCaptureDevice
@property(nonatomic, readonly) float torchLevel
```

# iPhoneにはできないこと

最後に、デジカメにはできてiPhoneだとできないことも紹介しましょう。iPhoneでは、次のような機能はどう頑張っても実現できません。

- シャッター速度の制御
- ISO感度の制御
- フラッシュの強さ制御（トーチは可能）

- - - - -

以上です。思っていたより沢山のことができる・できないことが少ないと感じたのではないでしょうか。そうなんです、iOSのバージョンが上がるたびに機能がたくさん追加されていて、今ではデジカメでできる機能のほとんどは、iPhoneでも実現できてしまうのです。

iPhoneでのカメラ撮影は何より楽しいので、これからもいろいろなアプリが出てくるといいですね。

それでは、iPhoneと [この本](http://www.amazon.co.jp/gp/product/4844335200?ie=UTF8&camp=1207&creative=8411&creativeASIN=4844335200&linkCode=shr&tag=ktkt02-22&qid=1385912013&sr=8-1) とで、楽しいクリスマス＆新年を過ごしましょう！（しつこい）。

![上を目指すプログラマーのためのiPhoneアプリ開発テクニック iOS 7編](https://qiita-image-store.s3.amazonaws.com/0/5210/6485e304-b71f-1c54-921d-cf5c171da263.png)