• 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. }

  • 相关阅读:
    智慧化工园区管理平台综合解决方案
    作用域与作用域链--面试题
    Spring 源码(14)Spring Bean 的创建过程(5)
    react 项目商城中,显示或者隐藏组件(锚点)
    自动化测试必会之数据驱动测试
    AI大模型服务应用场景
    内网离线安装docker并配置使用nexus为docker私服
    Idea工具中,使用Mapper对象有红线
    高斯算法的原理及其与常规求和方法的区别
    docker配置nginx
  • 原文地址:https://blog.csdn.net/watson2017/article/details/133786776