2

AVCaptureStillImageOutput からピクセル データをキャプチャしようとしていますが、画像を CGImage にトリミングすると、方向が変更されることに気付きました。これをテストするために、一時的な画像をフォト ライブラリに出力します。画像がトリミングされる前であっても、画像全体が回転していないのにサムネイルが回転していることに気付きました。(これは後で、適切なサイズの画像を必要とするカスタム pixelDataManager に UIImage を渡すときに問題になります。)

設定captureVideoPreviewLayer.orientation = AVCaptureVideoOrientationPortrait;[videoConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];ても何も変わらないようでした。

何かご意見は???セクションごとに分割します...

1) セッション、入力、および出力のセットアップ:

    // Create a capture session
    AVCaptureSession *session = [[AVCaptureSession alloc] init];
    session.sessionPreset = AVCaptureSessionPresetMedium;

    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

    // Add capture layer to visible view    
    captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResize;
    captureVideoPreviewLayer.frame = screenBounds;
    captureVideoPreviewLayer.bounds = screenBounds;
    captureVideoPreviewLayer.orientation = AVCaptureVideoOrientationPortrait;
    [self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    // Setup error handling
    NSError *error = nil;
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
    if (!input) {
        // Handle the error appropriately.
        NSLog(@"ERROR: trying to open camera: %@", error);
    }
    [session addInput:input];

    // Start session
    [session startRunning];

    // Output image data 
    stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];
    [stillImageOutput setOutputSettings:outputSettings];

    [session addOutput:stillImageOutput];

2) ビデオ接続のセットアップ:

AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in stillImageOutput.connections)
{
    for (AVCaptureInputPort *port in [connection inputPorts])
    {
        if ([[port mediaType] isEqual:AVMediaTypeVideo] )
        {
            videoConnection = connection;
            break;
        }
    }
    if (videoConnection) { break; }
}

if ([videoConnection isVideoOrientationSupported])
{
    [videoConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];
}

3) キャプチャした画像を出力します。

NSLog(@"about to request a capture from: %@", stillImageOutput);
[stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
{         
    NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
    UIImage *image = [[UIImage alloc] initWithData:imageData];
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    //......
}
4

1 に答える 1

3

これを行うと、画像はUIImageとして提供されますが、実際には、原点が異なる(左下だと思います)基になるQuartz CGImageデータを使用しています。つまり、画像を使用すると、画像が横に回転します。 。

UIImageをパラメーターとして呼び出して、それを修正し、修正されたUIImageを返すC関数を見つけました。

http://blog.logichigh.com/2008/06/05/uiimage-fix/

于 2011-09-06T12:21:55.873 に答える