Повернуть CGImage с видеокадра - PullRequest
17 голосов
/ 04 декабря 2010

Это код Apple (из Технических вопросов и ответов 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);
}

Ответы [ 3 ]

25 голосов
/ 04 декабря 2010

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

int frontCameraImageOrientation = UIImageOrientationLeftMirrored;
int backCameraImageOrientation = UIImageOrientationRight;

UIImage *image = [[UIImage alloc] initWithCGImage:newImage scale:(CGFloat)1.0 orientation:frontCameraImageOrientation];
3 голосов
/ 02 апреля 2015

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

connection.videoOrientation = AVCaptureVideoOrientationPortrait

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

2 голосов
/ 15 апреля 2015

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

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

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

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

...