iOS UIImage 与 RGBA 相互转换

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 基础

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 线程

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> OpenGL ES

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> GPUImage

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> AVFoundation

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> CocoaPods


一.函数简介

iOS 视频图像开发中无法避免使用到 UIImage 与 Bytes Pixel 之间转换。bytes pixel 可以理解为将一张图片的所有像素点写到二维数组中。

/**
*  @param data                 指向要渲染的绘制内存的地址。这个内存块的大小至少是(bytesPerRow*height)个字节
*  @param width                bitmap的宽度,单位为像素
*  @param height               bitmap的高度,单位为像素
*  @param bitsPerComponent     内存中像素的每个组件的位数.例如,对于32位像素格式和RGB颜色空间,你应该将这个值设为8.
*  @param bytesPerRow          bitmap的每一行在内存所占的比特数
*  @param space                bitmap上下文使用的颜色空间
*  @param bitmapInfo           指定bitmap是否包含alpha通道,像素中alpha通道的相对位置,像素组件是整形还是浮点型等信息的字符串。
*/

CGContextRef CGBitmapContextCreate(void *data, size_t width, size_t height, size_t bitsPerComponent, size_t bytesPerRow, CGColorSpaceRef colorspace, CGBitmapInfo bitmapInfo);

二.UIImage 转 RGBA

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:iOS UIImage 转 RGBA 
//@Time:2021/09/01 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

- (unsigned char*)pixelBRGABytesFromImage:(UIImage *)image {
    int imageWidth = image.size.width;
    int imageHeight = image.size.height;

    CGImageRef cgImage = [image CGImage];

    unsigned char* srcPixel = (unsigned char*)calloc(1, (int)imageWidth*(int)imageHeight*4);
    CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB();

    //kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast
    //kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst
    CGContextRef imageContext = CGBitmapContextCreate(srcPixel, imageWidth, imageHeight, 8, 4*imageWidth, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);

    CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, imageWidth, imageHeight), cgImage);

    CGContextRelease(imageContext);
    CGColorSpaceRelease(genericRGBColorspace);
    
    //需要用户自己释放,否则有内存泄漏
    return srcPixel;;
    
}

三.RGBA 转 UIImage

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:iOS RGBA 转 UIImage
//@Time:2021/08/31 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

-(UIImage*)getImageFromRGBA:(GLubyte*)pixel width:(int)w height:(int)h
{
    int perPix = 4;
    int width = w;
    int height = h;
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef newContext = CGBitmapContextCreate(pixel, width, height, 8,width * perPix,colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
    
    CGImageRef frame = CGBitmapContextCreateImage(newContext);
    UIImage* image = [UIImage imageWithCGImage:frame];
    
    CGImageRelease(frame);
    CGContextRelease(newContext);
    CGColorSpaceRelease(colorSpace);
    return image;
    
}

四.猜你喜欢


未经允许不得转载:猿说编程 » iOS UIImage 与 RGBA 相互转换
喜欢(0) 打赏

评论抢沙发

评论前必须登录!

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏