博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS常用图像格式转换
阅读量:6971 次
发布时间:2019-06-27

本文共 6447 字,大约阅读时间需要 21 分钟。

在iOS多媒体开发时,需要经常转换图像格式以便调试。下面列了一些常用工具方法,在UIImage, CVPixelBufferRef,Texture之间完成格式转换。

1. 其他格式转为UIImage

1.1 CVImageBufferRef (RGB)转为UIImage

- (UIImage *)imageFromRGBImageBuffer:(CVImageBufferRef)imageBuffer {    CVPixelBufferLockBaseAddress(imageBuffer, 0);    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);    size_t width = CVPixelBufferGetWidth(imageBuffer);    size_t height = CVPixelBufferGetHeight(imageBuffer);    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();    CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);    CGImageRef quartzImage = CGBitmapContextCreateImage(context);    CVPixelBufferUnlockBaseAddress(imageBuffer,0);    CGContextRelease(context);    CGColorSpaceRelease(colorSpace);    UIImage *image = [UIImage imageWithCGImage:quartzImage];    CGImageRelease(quartzImage);    return (image);}

1.2 CVImageBufferRef (YUV)转为UIImage

- (UIImage *)imageFromYUVImageBuffer:(CVImageBufferRef)imageBuffer {    CVPixelBufferLockBaseAddress(imageBuffer, 0);    size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0);    size_t width = CVPixelBufferGetWidthOfPlane(imageBuffer, 0);    size_t height = CVPixelBufferGetHeightOfPlane(imageBuffer, 0);    void *lumaAddress = CVPixelBufferGetBaseAddress(imageBuffer);    CGColorSpaceRef rgbSpace = CGColorSpaceCreateDeviceGray();    CGContextRef context = CGBitmapContextCreate(lumaAddress, width, height, 8, bytesPerRow, rgbSpace, kCGBitmapByteOrderDefault );    CGImageRef imageRef = CGBitmapContextCreateImage(context);    CGContextRelease(context);    CVPixelBufferUnlockBaseAddress(imageBuffer, 0);    UIImage *image = [UIImage imageWithCGImage:imageRef];    CGImageRelease(imageRef);    return image;}

1.3 纹理 (Texture)转为UIImage

- (UIImage *)imageFromTextureWithwidth:(int)width height:(int)height {    // glActiveTexture(GL_TEXTURE1); 先绑定某个纹理    int size = width * height * 4;    GLubyte *buffer = malloc(size);    glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, size, NULL);    int bitsPerComponent = 8;    int bitsPerPixel = 32;    int bytesPerRow = 4 * width;    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;    CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);    UIImage *image = [UIImage imageWithCGImage:imageRef];    free(buffer);    return image;}

1.4 data (RGB)转为UIImage

- (UIImage *)imageFromRGBData:(void *)data width:(int)width height:(int)height {    CGColorSpaceRef rgbSpace = CGColorSpaceCreateDeviceRGB();    CGContextRef context = CGBitmapContextCreate(data, width, height, 8, width*4, rgbSpace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little );    CGImageRef imageRef = CGBitmapContextCreateImage(context);    CGContextRelease(context);    UIImage *image = [UIImage imageWithCGImage:imageRef];    CGImageRelease(imageRef);    return image;}

1.5 data (Y)转为UIImage

- (UIImage *)imageFromYData:(void *)data width:(int)width height:(int)height {    CGColorSpaceRef rgbSpace = CGColorSpaceCreateDeviceGray();    CGContextRef context = CGBitmapContextCreate(data, width, height, 8, width, rgbSpace, kCGBitmapByteOrderDefault );    CGImageRef imageRef = CGBitmapContextCreateImage(context);    CGContextRelease(context);    UIImage *image = [UIImage imageWithCGImage:imageRef];    CGImageRelease(imageRef);    return image;}

2. UIImage转为其他格式

2.1 UIImage转为CVPixelBufferRef(RGB)

- (CVPixelBufferRef)imageToRGBPixelBuffer:(UIImage *)image {    CGSize frameSize = CGSizeMake(CGImageGetWidth(image.CGImage),CGImageGetHeight(image.CGImage));    NSDictionary *options =    [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],kCVPixelBufferCGImageCompatibilityKey,[NSNumber numberWithBool:YES],kCVPixelBufferCGBitmapContextCompatibilityKey,nil];    CVPixelBufferRef pxbuffer = NULL;    CVReturn status =    CVPixelBufferCreate(kCFAllocatorDefault, frameSize.width, frameSize.height,kCVPixelFormatType_32BGRA, (__bridge CFDictionaryRef)options, &pxbuffer);    NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);    CVPixelBufferLockBaseAddress(pxbuffer, 0);    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();    CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width, frameSize.height,8, CVPixelBufferGetBytesPerRow(pxbuffer),rgbColorSpace,(CGBitmapInfo)kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image.CGImage),CGImageGetHeight(image.CGImage)), image.CGImage);    CGColorSpaceRelease(rgbColorSpace);    CGContextRelease(context);    CVPixelBufferUnlockBaseAddress(pxbuffer, 0);    return pxbuffer;}

2.2 UIImage转为CVPixelBufferRef(YUV)

- (CVPixelBufferRef)imageToYUVPixelBuffer:(UIImage *)image {    CGSize frameSize = CGSizeMake(CGImageGetWidth(image.CGImage), CGImageGetHeight(image.CGImage));    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:                             [NSNumber numberWithBool:YES],kCVPixelBufferCGImageCompatibilityKey,                             [NSNumber numberWithBool:YES],kCVPixelBufferCGBitmapContextCompatibilityKey,nil];    CVPixelBufferRef pxbuffer = NULL;    CVPixelBufferCreate(kCFAllocatorDefault, frameSize.width, frameSize.height,kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, (__bridge CFDictionaryRef)options,&pxbuffer);    CVPixelBufferLockBaseAddress(pxbuffer, 0);    void *pxdata = CVPixelBufferGetBaseAddressOfPlane(pxbuffer,0);    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();    CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width, frameSize.height,8,CVPixelBufferGetBytesPerRowOfPlane(pxbuffer, 0),colorSpace,kCGImageAlphaNone);    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image.CGImage),CGImageGetHeight(image.CGImage)), image.CGImage);    CGColorSpaceRelease(colorSpace);    CGContextRelease(context);    CVPixelBufferUnlockBaseAddress(pxbuffer, 0);    return pxbuffer;}

转载地址:http://gobsl.baihongyu.com/

你可能感兴趣的文章
django admin使用-后台数据库管理界面
查看>>
Fragment 点击事件的穿透和重叠bug
查看>>
springBoot整合ftp上传图片功能
查看>>
34. Find First and Last Position of Element in Sorted Array
查看>>
113. Path Sum II
查看>>
Jenkins定时构建和轮询SCM设置说明
查看>>
Poj(2421),Prim最小生成树
查看>>
UPS故障案例集(二)
查看>>
[luogu 3803]【模板】多项式乘法
查看>>
MySQL中的锁、隔离等级和读场景
查看>>
流弊博客集锦(updating)
查看>>
dedecms 的这个dede:arclist里怎么调用全局变量?
查看>>
eclipse上跑项目越来越慢的解决办法
查看>>
个人开公司的流程,以后用得着(经典)(转)
查看>>
跟踪内核启动过程CONFIG_DEBUG_LL【转自】
查看>>
系统数据文件和信息
查看>>
Laravel 程序架构设计思路:使用动作类
查看>>
Java线程池实现原理与技术(ThreadPoolExecutor、Executors)
查看>>
Linux内核读书笔记第五周链接
查看>>
工厂模式(Factory Patter)
查看>>