从CGBitmapContextCreate 报错到iOS颜色空间和像素格式

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

最重要的一点是,如果不是灰度图,请使用4通道格式!

源于一个问题,CGBitmapContextCreate在创建位图上下文时,返回空,检查了宽、高、bytesPerRow等参数都没问题,其他几个参数不知道什么意思,所以就选了RGB的选项,然后就一直返回nil,很苦恼,逼着我看这几个参数,如下所示:

data

一个指针,指向位图被渲染的内存块。这个内存块的大小至少应该是(bytesPerRow * height),注意,可以传入NULL,这样会自动创建合适的大小

width

待创建的位图的宽度

height

待创建的位图的高度

bitsPerComponent

每个通道需要的位数,举例,32位像素格式以及一个RGB颜色空间,每个通道就是8bit

bytesPerRow

每一行像素需要的字节数,注意,如果data传入NULL,那么这个参数可以取0来自动计算

space

颜色空间,一般三种GRAY、RGB以及CMYK

bitmapInfo

常数,说明alpha通道在像素内的相对位置,以及像素是浮点数还是整数。

举个完整的例子,如果要处理的是224宽*224高的32RGBA图像,data可以是NULL,也可以是申请的内存块,width = 224, height= 224,bitPerComponent = 8, bytesPerRow = 224*1*4(中间的1是因为每个通道刚好是1个字节),space一般传入CGColorSpaceCreateDeviceRGB( ),这个函数后面再说,bitmapInfo = (CGBitmapInfo)kCGImageAlphaPremultipliedLast,这个参数后面也会细说。

CGBitmapContextCreate这个函数返回空,主要原因是data与space、bitmapInfo等不对称。我之前一直想操作RGB图像,因此data大小是224*224*3,bytesPerRow是224*3,bitmapInfo是kCGImageAlphaNone,但是一直返回nil,统一成32bit像素格式后,一切都解决了。

再来说CGColorSpaceCreateDeviceRGB(),此函数返回一个和机器有关的颜色空间,在使用完之后调用CGColorSpaceRelease释放。

这就是帮助文档对这个函数的介绍,真是偷工减料,在iOS中我们常用的颜色空间是三种:

  • kCGColorSpaceGenericGray:灰度颜色空间,范围从绝对黑色(值0.0)到绝对白色(值1.0)的单个值;

  • kCGColorSpaceGenericRGB:最常用的RGB颜色空间,一个三分量颜色空间(红色,绿色和蓝色),用于模拟在彩色显示器上组成单个像素的方式,RGB颜色空间的每个组件的范围从0.0(零强度)到1.0(全强度);

  • kCGColorSpaceGenericCMYK:CMYK颜色空间,这是一个四色组件颜色空间(青色,品红色,黄色和黑色),用于模拟在打印过程中墨水堆积的方式,CMYK颜色空间的每个组件的范围从0.0(不吸收颜色)到1.0(完全吸收颜色)

这个函数调用会返回一个固定值,在我的mac电脑上,返回kCGColorSpaceGenericRGB,注意,这里虽然是RGB,但是并不意味着就是24RGB,这个24得由像素格式来决定。

iOS位图支持以下17种像素格式:

其中,bpp指bits per pixel, bpc指 bits per component.

所以当我们读入一个24RGB的图,会发现,颜色空间肯定是支持的,但是像素格式iOS并不支持,这个时候,就需要对图像做个转换,转成iOS支持的格式,再进行处理。

参考:

https://www.jianshu.com/p/3ce14a2a51ed   写的很详细

发布了42 篇原创文章 · 获赞 33 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/gaussrieman123/article/details/89446143