• iOS UIImage和CVPixelBuffer互相转换


    UIImage转CVPixelBuffer

    1. + (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image {
    2. NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    3. [NSNumber numberWithBool:true], kCVPixelBufferCGImageCompatibilityKey,
    4. [NSNumber numberWithBool:true], kCVPixelBufferCGBitmapContextCompatibilityKey, nil];
    5. CVPixelBufferRef pxbuffer = NULL;
    6. size_t width = CGImageGetWidth(image);
    7. size_t height = CGImageGetHeight(image);
    8. CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_32BGRA, (__bridge CFDictionaryRef)options, &pxbuffer);
    9. if (status != kCVReturnSuccess) {
    10. NSLog(@"CVPixelBufferCreate Fail");
    11. }
    12. CVPixelBufferLockBaseAddress(pxbuffer, 0);
    13. void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
    14. CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    15. CGContextRef context = CGBitmapContextCreate(pxdata, width, height, 8, CVPixelBufferGetBytesPerRow(pxbuffer), rgbColorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipFirst);
    16. CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
    17. CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
    18. CGColorSpaceRelease(rgbColorSpace);
    19. CGContextRelease(context);
    20. return pxbuffer;
    21. }

    CVPixelBuffer转UIImage

    1. + (UIImage *)imageFromPixelBuffer:(CVPixelBufferRef)pixelBuffer {
    2. CVImageBufferRef imageBuffer = pixelBuffer;
    3. CVPixelBufferLockBaseAddress(imageBuffer, 0);
    4. void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
    5. size_t width = CVPixelBufferGetWidth(imageBuffer);
    6. size_t height = CVPixelBufferGetHeight(imageBuffer);
    7. size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer);
    8. size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0);
    9. CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    10. CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, baseAddress, bufferSize, NULL);
    11. CGImageRef cgImage = CGImageCreate(width, height, 8, 32, bytesPerRow, rgbColorSpace, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrderDefault, provider, NULL, true, kCGRenderingIntentDefault);
    12. UIImage *image = [UIImage imageWithCGImage:cgImage];
    13. CGImageRelease(cgImage);
    14. CGDataProviderRelease(provider);
    15. CGColorSpaceRelease(rgbColorSpace);
    16. CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
    17. return image;
    18. }

    CMSampleBuffer转UIImage

    1. + (UIImage *)imageFromSampleBuffer:(CMSampleBufferRef)sampleBufferRef {
    2. CVImageBufferRef pxbuffer = CMSampleBufferGetImageBuffer(sampleBufferRef);
    3. CIImage *ciImage = [CIImage imageWithCVImageBuffer:pxbuffer];
    4. CIContext *ciContext = [[CIContext alloc] init];
    5. CGImage *cgImage = [ciContext createCGImage:ciImage fromRect:ciImage.extent];
    6. UIImage *image = [UIImage imageWithCGImage:cgImage];
    7. return image;
    8. }

  • 相关阅读:
    全景分割(Panoptic Segmentation)(CVPR 2019)
    MySQL5.7高级函数:JSON_ARRAYAGG和JSON_OBJECT的使用
    Peter算法小课堂—DP背包问题
    某城商行两地三中心建设存储架构规划及方案验证实践
    深度学习进行图像识别:技术详解与实践
    『现学现忘』Git后悔药 — 30、版本回退git reset --hard命令说明
    在ASF中使用On Demand生产DEM等产品时使用不同参考DEM的区别
    [安洵杯 2019]不是文件上传
    软件设计师学习笔记12-数据库的基本概念+数据库的设计过程+概念设计+逻辑设计
    基于.NET6的简单三层管理系统
  • 原文地址:https://blog.csdn.net/watson2017/article/details/133786776