iphone - 将 UIImage 转换为 CVPixelBufferRef

标签 iphone objective-c uiimage

我想将 UIImage 对象转换为 CVPixelBufferRef 对象,但我完全不知道。而且我找不到执行此类操作的任何示例代码。

有人可以帮帮我吗?提前致谢!

你好

最佳答案

有不同的方法可以做到这一点,这些函数将 CGImage 转换为像素缓冲区。 UImageCGImage 的包装器,因此要获得 CGImage,您只需调用方法 .CGImage
其他方法也是从缓冲区创建一个 CIImage(已发布)或使用 Accelerate 框架,这可能是最快但也是最难的。

- (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;
}

关于iphone - 将 UIImage 转换为 CVPixelBufferRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3838696/

相关文章:

ios - 在 Swift 中从属性检查器列表更改栏按钮图像

ios - 如何使用 alpha channel - PNG(替换颜色)仅对 UIImage 的一部分着色?

ios - 在 iOS 中打开 PDF 阅读器的 PDF 链接

ios - XCTest:点击 navigationItem 返回按钮

iphone - xcdatamodel 内容消失

ios - 以编程方式在表格行单元格内添加多个图像

ios - IBOutletCollection 未与 Storyboard 中的 UILabels 连接

ios - UITableView 需要长按选择一行

ios - 剪切图像的抗锯齿

ios - 如何在用户单击 ios 中的 "more "按钮时展开 UITextview