问题描述
我想将UIImage对象转换为CVPixelBufferRef对象,但我绝对不知道。而我找不到任何示例代码执行此类操作。
I want to convert a UIImage object to a CVPixelBufferRef object, but I have absolutly no idea. And I can't find any example code doing anything like this.
有人可以帮助我吗? THX提前!
Can someone please help me? THX in advance!
C YA
推荐答案
有不同的方式为此,这些函数从 CGImage
转换像素缓冲区。 UImage
是 CGImage
的包装器,因此要获得CGImage,您只需要调用方法 .CGImage
。
其他方法也是从缓冲区(已发布)创建 CIImage
或使用加速
框架,这可能是最快但也最难的。
There are different ways to do that, those functions convert a pixel buffer from a CGImage
. UImage
is a wrapper around CGImage
, thus to get a CGImage you just need to call the method .CGImage
.
The other ways are also create a CIImage
from the buffer (already posted) or use the Accelerate
framework, that is probably the fastest but also the hardest.
- (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image
{
NSDictionary *options = @{
(NSString*)kCVPixelBufferCGImageCompatibilityKey : @YES,
(NSString*)kCVPixelBufferCGBitmapContextCompatibilityKey : @YES,
};
CVPixelBufferRef pxbuffer = NULL;
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, CGImageGetWidth(image),
CGImageGetHeight(image), kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options,
&pxbuffer);
if (status!=kCVReturnSuccess) {
NSLog(@"Operation failed");
}
NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
CVPixelBufferLockBaseAddress(pxbuffer, 0);
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pxdata, CGImageGetWidth(image),
CGImageGetHeight(image), 8, 4*CGImageGetWidth(image), rgbColorSpace,
kCGImageAlphaNoneSkipFirst);
NSParameterAssert(context);
CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));
CGAffineTransform flipVertical = CGAffineTransformMake( 1, 0, 0, -1, 0, CGImageGetHeight(image) );
CGContextConcatCTM(context, flipVertical);
CGAffineTransform flipHorizontal = CGAffineTransformMake( -1.0, 0.0, 0.0, 1.0, CGImageGetWidth(image), 0.0 );
CGContextConcatCTM(context, flipHorizontal);
CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
CGImageGetHeight(image)), image);
CGColorSpaceRelease(rgbColorSpace);
CGContextRelease(context);
CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
return pxbuffer;
}
这篇关于将UIImage转换为CVPixelBufferRef的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!