Неправильная ориентация UIImage из AVCaptureStillImageOutput - PullRequest
2 голосов
/ 10 августа 2011

Я пытаюсь захватить данные пикселей из AVCaptureStillImageOutput и заметил, что после обрезки изображения в CGImage оно становится переориентированным. Чтобы проверить это, я вывожу временное изображение в библиотеку фотографий. Теперь я заметил, что даже до того, как изображение обрезается, его миниатюра поворачивается, а полное изображение - нет. (Это позже становится проблемой, когда я передаю UIImage своему пользовательскому pixelDataManager, который требует правильных размеров изображения.)

Установка 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);
    //......
}

1 Ответ

3 голосов
/ 06 сентября 2011

Когда вы делаете это, хотя изображение предоставляется вам как UIImage, оно на самом деле использует базовые данные Quartz CGImage, которые имеют другую исходную точку (думаю, в левом нижнем углу), что означает, что когда вы используете изображение, оно поворачивается в сторону.

Я нашел функцию C, которую вы можете вызвать с UIImage в качестве параметра, который исправляет ее и возвращает фиксированный UIImage.

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

...