我正在尝试拍摄屏幕截图并制作电影。在纵向模式下一切正常,但我的应用程序只是一个横向应用程序。
我正在使用此方法将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的坐标系是什么?
我需要的正确转换是什么?
答案 0 :(得分:1)
实际上,如果应用程序以横向模式启动,则视图框架应该已经具有正确的大小,因此您不需要旋转上下文。
您只需按以下方式翻转上下文的y轴:
{{1}}
答案 1 :(得分:0)
是否会发生这种情况,因为CGContext
的尺寸与CVPixelBuffer
的尺寸不符?当您绘制图像时,您可能会走过行的末尾并开始在下一行上绘制像素,因为您的横向图像比像素缓冲区的宽度宽。
如果您创建的CGContext
大小基于像素缓冲区的大小,然后如果像素缓冲区大小与frameSize
不匹配,那么您应用旋转变换会怎么样?< / p>
或者,或者,当您处于横向模式时,重新创建具有与横向尺寸匹配的不同尺寸的像素缓冲池。
(我不熟悉CoreVideo API,所以这只是一个猜测)