Подтвердить что ты не робот

Повернуть CGImage, взятый из видеорамки

Это код Apple (от Technical Q & A QA1702) для получения UIImage из видео-буфера. К сожалению, возвращенное изображение повернуто на 90 градусов. Как изменить это, чтобы возвращаемое изображение было правильно ориентировано?

- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer 
{
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    CVPixelBufferLockBaseAddress(imageBuffer, 0); 

    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); 

    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, 
                                                 bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 

    CGImageRef quartzImage = CGBitmapContextCreateImage(context); 
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);

    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace);

    UIImage *image = [UIImage imageWithCGImage:quartzImage];

    CGImageRelease(quartzImage);

    return (image);
}
4b9b3361

Ответ 1

В зависимости от того, используете ли вы переднюю камеру или заднюю камеру

int frontCameraImageOrientation = UIImageOrientationLeftMirrored;
int backCameraImageOrientation = UIImageOrientationRight;

UIImage *image = [[UIImage alloc] initWithCGImage:newImage scale:(CGFloat)1.0 orientation:frontCameraImageOrientation];

Ответ 2

Вы можете изменить videoOrientation, таким образом вы получите правильное изображение

connection.videoOrientation = AVCaptureVideoOrientationPortrait

Поскольку по умолчанию ориентация видео не является портретом.

Ответ 3

Просто поверните контекст

Просто поверните контекст в радианах. Этот вызов будет поворачивать контекст на 90 градусов.

CGFloat degrees = 90.f;
CGFloat radians = degrees * (M_PI / 180.f);
CGContextRotateCTM(context, radians);

Вы можете легко установить этот метод для правильной ориентации и поворота.