Appleの iOS 6.0の機能ページ では、以前は
内蔵カメラの高度な機能を活用してください。新しいAPIを使用すると、フォーカス、露出、関心領域を制御できます。顔検出APIを使用して顔にアクセスして表示したり、ハードウェア対応のビデオ安定化を活用したりすることもできます。
このテキストはその後削除され、露出を制御するための新しいメソッドがAPIに見つかりません。 「露出設定」のクラスAVCaptureDevice
には、iOS6.0の新しいプロパティ/メソッドはありません。 APIで公開するための新機能をどこで見つけることができるか知っていますか?
AVCaptureDevice
に-exposureMode
プロパティがあるのは事実ですが、これはモード(オフ/自動/連続)の設定専用であり、実際のFストップ、SS、またはISOではありません。 「露出」制御を提供するカメラアプリはすべて、後処理を通じてそれを行うようです。
ただし、これを行うためのフレームワークには文書化されていないAPIがあるようです。 AVCaptureDevice.h
の完全なヘッダー ( class-dump 経由)を確認し、次のメソッドに注意してください。
- (void)setManualExposureSupportEnabled:(BOOL)arg1;
- (BOOL)isManualExposureSupportEnabled;
- (void)setExposureGain:(float)arg1;
- (float)exposureGain;
- (void)setExposureDuration:(struct { long long x1; int x2; unsigned int x3; long long x4; })arg1;
- (struct { long long x1; int x2; unsigned int x3; long long x4; })exposureDuration;
- (void)setExposureMode:(int)arg1;
- (int)exposureMode;
- (BOOL)isExposureModeSupported:(int)arg1;
私の推測では、gain
は同等のFストップ(固定絞り)であり、duration
はシャッタースピードです。これらはiPhone5の 低照度ブーストモード に使用されているのだろうか。
otool
を使用して、シンボルをいじってつなぎ合わせることができます。手動制御を有効にするための新しい定数がexposureMode
にある可能性があり、exposureDuration
にもフラグがあるようです。これらを呼び出すときは、必ず新しい-isExposureModeSupported:
を使用し、-respondsToSelector:
を呼び出して互換性を確認してください。
いつものように、プライベートAPIの使用は、Appleによって嫌われ、App Storeから拒否される原因になります。これを回避するには、-performSelector:
または-を使用して呼び出しを非表示にするなどの方法があります。 obc_msgsend
rot13文字列などを使用します。これは、アプリのバイナリに対してのみ静的分析を行うと確信しているためです。
私はなんとかカメラを「だまして」より短い露光時間を実行することに成功しましたが、それは同様の(マクロ)画像取得を行う人にのみ役立つと思います。最初に、AVCaptureExposureModeContinuousAutoExposureを使用するようにAVCaptureDeviceを設定し、フラッシュをTorchModeに設定しました。私はその後、仕上げにadjustingExposureを監視するためのキーと値のオブザーバをUnlockForConfigurationとを設定します。次に、デバイスを再度ロックし、AVCaptureExposureModeLockedに切り替えて、トーチをオフにします。これは、カメラは非点灯シーンで選択することになるものより短いシャッタースピードを設定するブルートフォースの効果があります。トーチレベルで遊ぶことで、任意の相対シャッター速度値を設定できます(もちろん、トーチをオンのままにしておくのが最善ですが、私のアプリケーションでは、被写体にグレアが発生します)。繰り返しになりますが、これはオブジェクトの距離が非常に近い場合(たとえば、6インチ未満)にのみ実際に機能しますが、クローズアップ画像での握手によるぼやけをなくすことができます。欠点は、カメラのゲインをスプーフィングする方法がないため、画像が暗くなることですが、特定のアプリケーションでは問題ありません。
Michael Grinichの優れた情報のフォローアップとして、プライベートAPIの一部の呼び出しに順序の依存関係があることがわかりました。 「手動」露出コントロールを使用するには、それらを有効にする必要がありますbefore次のようにモードを設定します。
#define AVCaptureExposureModeManual 3
NSError* error = nil;
if ([captureDevice lockForConfiguration:&error]) {
captureDevice.manualExposureSupportEnabled = YES;
if ([captureDevice isExposureModeSupported:AVCaptureExposureModeManual]) {
captureDevice.exposureMode = AVCaptureExposureModeManual;
captureDevice.exposureGain = ...;
captureDevice.exposureDuration = {...};
}
[captureDevice unlockForConfiguration];
}
これらすべては iOS-ManualCamera で示されています。
リンクされたテキストを更新したようです。公開用の新しいAPIについては言及されていません。
内蔵カメラの強力な新機能を使用します。新しいAPIは、リアルタイムのビデオ安定化、改善されたLEDフラッシュ、顔検出と表示をサポートします。キャプチャ中にドロップされたフレームのレポートを取得し、新しいユーティリティを活用してUIタッチをフォーカスおよび露出コマンドにマッピングできます。また、iPhone 5をサポートするアプリは、低照度ブーストモードを利用できます。
そこにisiPhone 5のオプトインローライトブーストモードがあります ここではJim Rhoadesによる (そして- この開発者フォーラムの投稿 、ログインが必要です)。
IOS 8.0以降、これがついに可能になりました。
Appleドキュメントの setExposureModeCustomWithDuration などを参照してください。