5

captureStillImageAsynchronouslyFromConnection に奇妙な問題があります。ビデオがミラーリングされているときに jpegStillImageNSDataRepresentation を使用して画像を保存すると、カメラ ロールの画像が時計回りに 90 度回転します。ただし、ミラーリングされていない場合は、向きは問題ありません。コードを投稿します。他の誰かがこの問題を抱えていますか/修正を知っていますか?

更新: いくつかのテストを実行したところ、高さと幅 (640x480) は問題なく、デバイスの向きを反映しています。縦向きで写真を撮ると、UIImageOrientationLeft が報告され、ミラーリングされた場合は UIImageOrientationLeftMirrored が報告されます。

更新 2: カメラ ロールに保存された写真を表示すると、写真間をスワイプしたときの画像と同様に、画像のプレビューは正しい向きになりますが、写真が完全に読み込まれると、90 度回転します。これはカメラロールの問題でしょうか?(私は 4.3.3 を使用しています)

- (void) captureImageAndSaveToCameraRoll
{
    AVCaptureConnection *stillImageConnection = [AVCamUtilities connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self stillImageOutput] connections]];
    if ([stillImageConnection isVideoOrientationSupported])
        [stillImageConnection setVideoOrientation:[self 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];
                                                                 [library writeImageToSavedPhotosAlbum:[image CGImage]
                                                                                           orientation:(ALAssetOrientation)[image imageOrientation]
                                                                                       completionBlock:completionBlock];
                                                                 [image release];

                                                                 [library release];
                                                             }
                                                             else
                                                                 completionBlock(nil, error);

                                                             if ([[self delegate] respondsToSelector:@selector(captureManagerStillImageCaptured:)]) {
                                                                 [[self delegate] captureManagerStillImageCaptured:self];
                                                             }
                                                         }];
}
4

3 に答える 3

2

新しく作成された画像に、ここで想定している方向が実際に設定されているかどうか疑問に思います。

[library writeImageToSavedPhotosAlbum:[image CGImage] orientation: (ALAssetOrientation) [image imageOrientation] completionBlock:completionBlock];

[image imageOrientation]特に、特にキャストが必要な場合は、問題の原因となる可能性があります...

あなたはどこかで画像の向きを見ていると言います、それはそれを[image imageOrientation]作成した直後からですか?

NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation: imageDataSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];

このメタデータは、実際には画像のピクセルデータ自体しか含まれていないのに、imageData返されるものであると想定しているのではないでしょうか。AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:

于 2011-06-24T06:15:16.347 に答える
0

一部のレポートによると、2009 年当時の iPhone の写真アプリケーションは、ミラーリングされた向きをまったくサポートしていませんでした。彼らがこれを部分的に修正した可能性は確かにありますが、場合によってはまだバグがあります (たとえば、UIImageView がcontentStretch正しく処理されない場合があることはわかっています)。これは簡単にテストできます。ブログのサンプル画像をカメラ ロールにロードして、何が起こるかを確認するだけです。

于 2011-06-19T19:30:55.273 に答える
0

iOS UIImagePickerController アップロード後の結果画像の向きに記載されている UIImage のカテゴリを作成する

ライブラリに保存する前に、画像に対してこのメ​​ソッドを呼び出します。

于 2011-06-20T16:36:12.143 に答える