UIIView到横向的CGContext坐标系

时间:2016-01-14 16:58:31

标签: ios objective-c

我正在尝试拍摄屏幕截图并制作电影。在纵向模式下一切正常,但我的应用程序只是一个横向应用程序。

我正在使用此方法将UIImage.CGImageRef添加到视频中:

- (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image  withSize:(CGSize)frameSize
{
    CVPixelBufferRef pxbuffer;

    if (pixelBufferPool == NULL) {
        NSLog(@"pixelBufferPool is null!");
        return nil;
    }
    CVReturn status = CVPixelBufferPoolCreatePixelBuffer (NULL, pixelBufferPool, &pxbuffer);
    if(status != kCVReturnSuccess) {
        NSLog(@"failed to create pixel buffer pool pixel buffer %i", status);
        return nil;
    }
    CVPixelBufferLockBaseAddress(pxbuffer, 0);
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);

    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width,
                                                 frameSize.height, 8, 4*frameSize.width, rgbColorSpace,
                                                 kCGImageAlphaNoneSkipFirst);

    //CGAffineTransform t = CGAffineTransformIdentity;
    //t = CGAffineTransformRotate(t, 0/*M_PI_2*/);
    //t = CGAffineTransformScale(t, -1.0, 1.0);
    //CGContextConcatCTM(context, t);

    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image)), image);

    CGColorSpaceRelease(rgbColorSpace);
    CGContextRelease(context);

    CVPixelBufferUnlockBaseAddress(pxbuffer, 0);

    return pxbuffer;
}

视频就像图像歪斜一样。我知道它因为UIImage和CGContext的坐标系不同,因此框架是倾斜的。但我不知道如何解决这个问题。

我尝试过旋转,缩放等等。但是一切都需要按照正确的顺序进行。

横向应用中UIImage的坐标系是什么,以及CGContext的坐标系是什么?

我需要的正确转换是什么?

Screen Shot

Movie

2 个答案:

答案 0 :(得分:1)

实际上,如果应用程序以横向模式启动,则视图框架应该已经具有正确的大小,因此您不需要旋转上下文。

您只需按以下方式翻转上下文的y轴:

{{1}}

答案 1 :(得分:0)

是否会发生这种情况,因为CGContext的尺寸与CVPixelBuffer的尺寸不符?当您绘制图像时,您可能会走过行的末尾并开始在下一行上绘制像素,因为您的横向图像比像素缓冲区的宽度宽。

如果您创建的CGContext大小基于像素缓冲区的大小,然后如果像素缓冲区大小与frameSize不匹配,那么您应用旋转变换会怎么样?< / p>

或者,或者,当您处于横向模式时,重新创建具有与横向尺寸匹配的不同尺寸的像素缓冲池。

(我不熟悉CoreVideo API,所以这只是一个猜测)