私はiOSでプロトタイプアプリを構築しており、それを行うためにいくつかのAppleサンプルコードを共食いしています(薄い氷、私は知っています-このコードはgotoステートメントを使用しています:\)。セッション520のAVCamプロジェクトを使用しています-カメラキャプチャの新機能。ビデオキャプチャ機能は必要ありません。静止画だけが必要です。
デバイスの入力と出力は次のように設定されます。
// Init the device inputs
AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self backFacingCamera] error:nil];
AVCaptureDeviceInput *newAudioInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self audioDevice] error:nil];
// Setup the still image file output
AVCaptureStillImageOutput *newStillImageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = @{AVVideoCodecKey: AVVideoCodecJPEG};
[newStillImageOutput setOutputSettings:outputSettings];
// Create session (use default AVCaptureSessionPresetHigh)
AVCaptureSession *newCaptureSession = [[AVCaptureSession alloc] init];
// Add inputs and output to the capture session
if ([newCaptureSession canAddInput:newVideoInput]) {
[newCaptureSession addInput:newVideoInput];
}
if ([newCaptureSession canAddInput:newAudioInput]) {
[newCaptureSession addInput:newAudioInput];
}
if ([newCaptureSession canAddOutput:newStillImageOutput]) {
[newCaptureSession addOutput:newStillImageOutput];
}
[self setStillImageOutput:newStillImageOutput];
[self setVideoInput:newVideoInput];
[self setAudioInput:newAudioInput];
[self setSession:newCaptureSession];
そして、シャッターボタンをタップしたときに呼び出されるメソッドは次のとおりです。
- (void) captureStillImage
{
AVCaptureConnection *stillImageConnection = [[self stillImageOutput] connectionWithMediaType:AVMediaTypeVideo];
if ([stillImageConnection isVideoOrientationSupported])
[stillImageConnection setVideoOrientation:orientation];
[[self stillImageOutput]
captureStillImageAsynchronouslyFromConnection:stillImageConnection
completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
ALAssetsLibraryWriteImageCompletionBlock completionBlock = ^(NSURL *assetURL, NSError *error) {
if (error)
{
if ([[self delegate] respondsToSelector:@selector(captureManager:didFailWithError:)])
{
[[self delegate] captureManager:self didFailWithError:error];
}
}
};
if (imageDataSampleBuffer != NULL)
{
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
UIImage *image = [[UIImage alloc] initWithData:imageData];
if ([self.delegate respondsToSelector:@selector(captureManagerCapturedImage:)])
{
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate captureManagerCapturedImage:image];
});
}
[library writeImageToSavedPhotosAlbum:[image CGImage]
orientation:(ALAssetOrientation)[image imageOrientation]
completionBlock:completionBlock];
}
else
{
completionBlock(nil, error);
}
if ([[self delegate] respondsToSelector:@selector(captureManagerStillImageCaptured:)])
{
[[self delegate] captureManagerStillImageCaptured:self];
}
}];
}
このコードは画像を正常にキャプチャし、ライブラリに保存します。しかし、作業中のある時点で、5メガピクセルの4:3画像のキャプチャから1920x1080の16:9画像のキャプチャに変更されました。アスペクト比が指定されている場所が見つからず、カメラの構成、キャプチャセッション、またはキャプチャ接続に関連するコードを変更していません。カメラが16:9の写真を撮り始めたのはなぜですか?
更新: Appleの元のサンプルコードを再実行したところ、ビデオから直接キャプチャされた16:9の画像も保存されているようです。以前は気が狂っていた可能性があります。または、Camera.appでテストショットを撮り、それを見ていました。ですから、私の本当の質問は、撮影中にカメラからのライブフィードを画面に表示し、フル解像度の写真を撮るにはどうすればよいかということです。UIImagePickerController
ライブカメラフィードの上に物を重ねることができる必要があるため、使用できません。
アップデート2:使用していたAVCaptureコードを破棄することで、これを解決することができました。UIImagePickerControllerが必要なことを実行することがわかりました。カスタムコントロールをオーバーレイできることに気づいていませんでした。写真の撮影が完了するまで、画面全体が引き継がれると思いました。