3

iOS 6.1 を搭載した iPad 3 Retina で、静止カメラを次のように初期化します。

stillCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionBack];
stillCamera.outputImageOrientation = UIInterfaceOrientationLandscapeLeft;

これらのフィルターを使用してカメラをセットアップしました。

UIImage *inputImage = [UIImage imageNamed:@"blank-1x1.png"];
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
[sourcePicture processImage];

chromaKeyBlendFilter = [[GPUImageChromaKeyBlendFilter alloc] init];
[chromaKeyBlendFilter setColorToReplaceRed:0.0 green:1.0 blue:0.0];
[chromaKeyBlendFilter setThresholdSensitivity:0.37f];
filter = chromaKeyBlendFilter;

[stillCamera addTarget:filter];
[sourcePicture addTarget:filter];

[filter addTarget:videoPreviewView]; // 1024x768 view
[stillCamera startCameraCapture];

そして、私が使用する画像をキャプチャするとき:

[stillCamera capturePhotoAsPNGProcessedUpToFilter:filter withCompletionHandler:^(NSData *processedPNG, NSError *error){
    self.currentImage = [UIImage imageWithData:processedPNG];
});

しかし、返される画像は、背面カメラに期待する 2420x1936 ではなく、画面サイズ (Retina スタイル) 2048x1536 です。また、#imageFromCurrentlyProcessedOutputWithOrientation# が画面サイズのみを返すことにも気付きました。GPUImageStillCamera.m のキャプチャ コードを見ると、そこから出力が開始されているように見えます。

GPUImage 以外のセットアップを使用するオプション/ボタンもあり、2420x1936 の PNG 画像が返されるため、理由はわかりません。

ここで何が間違っていますか?ヒントをありがとう(2420x1936が本当に欲しいので)。

4

1 に答える 1

0

まず第一に、iPad の背面カメラのフル解像度は 2592x1936 を意味していました (8x10 サイズの画像をトリミングしています)。結局のところ、私は「賢く」なりすぎようとしていたのです。

ボタンをタップして画像をキャプチャするときに、バックグラウンド スレッドで次のコードを使用して、非同期でキャプチャされたときにプロパティに保存された画像を取得しました (この場合、最大 8 MB の PNG ファイル)。

[stillCamera capturePhotoAsPNGProcessedUpToFilter:filter withCompletionHandler:^(NSData *processedPNG, NSError *error)
self.currentImage = [UIImage imageWithData:processedPNG];

しかし、そのキューをディスパッチした後、すぐにプレビュービューに移動し、そこで画像を取得しました

[filter imageFromCurrentlyProcessedOutputWithOrientation:UIImageOrientationUp]

これは 2048x1516 で、プレビュー用に iPad Retina に表示するには十分でした。そして、そのプレビューが閉じられると、self.currentImage が切り取られ、ファイル (および Core Data メタデータ) に保存されました。

私があまりにも「賢く」なったところで、プレビューが表示されているときに気がついたとき、カメラからの KVO コンソール メッセージがログに記録されていました。そのため、viewWillDisappear に「カメラの一時停止」を入れ、「カメラの再開」を再表示します。どうやら、カメラの一時停止コマンドが発行されると、すぐに処理を停止し、持っているものを currentImage プロパティにダンプします。これは常に 2048x1516 の画像であり、プレビューがさらに数秒待つことができた場合、フル解像度の画像ではありません。

私見、カメラが一時停止されている場合、バックグラウンドキャプチャスレッドは終了するまで続行し、カメラを一時停止する必要があります。しかし、私はこれで作業できます。問題を見つけてよかったです。

于 2013-05-07T20:34:53.897 に答える