Ios CGBitmapContextCreate:不支持的参数组合
我正在尝试创建一个8位灰度上下文,如下所示:Ios CGBitmapContextCreate:不支持的参数组合,ios,cgcontext,Ios,Cgcontext,我正在尝试创建一个8位灰度上下文,如下所示: CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); CGContextRef context = CGBitmapContextCreate( data, m_width, m_height, 8, m_width, colorSpace, kCGBitmapByteOrder32Little|kCGImageAlphaNone); 但我有以下错误: CGBit
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef context = CGBitmapContextCreate(
data, m_width, m_height, 8, m_width, colorSpace,
kCGBitmapByteOrder32Little|kCGImageAlphaNone);
但我有以下错误:
CGBitmapContextCreate: unsupported parameter combination:
8 integer bits/component; 8 bits/pixel; 1-component color space;
kCGImageAlphaNone; 1936 bytes/row.
为什么不支持这种组合?可能是
kCGBitmapByteOrder32Little
(这对单通道灰度图像毫无意义)
您可以将其从像素格式规范中删除。支持的每组件位、每像素位、颜色空间组合可以在“”中找到 正如Nikolai所写,将kCGBitmapByteOrder32Little与kCGImageAlphaNone一起使用对灰色空间没有意义(并且不受支持) 现在,根据每行字节数和高度,您需要为数据参数中的
CGBitmapContextCreate
提供足够的分配内存。您没有显示设置高度和为数据分配内存的代码,但我猜您的问题就在那里
此外,您实际上不需要自己分配内存(从iOS 4.0开始),根据文档,您可以传递NULL作为数据,以便为您分配内存。您以后仍然可以通过使用CGBitmapContextGetData
请求来访问数据指针
另一个注意事项是,将
m_width
作为bytesPerRow
传递仅在这种情况下正确(灰色空间,每像素1字节),但可能不是好的做法。如果为数据传递NULL,也可以在此处传递0,以便自动计算数据。谢谢您的回答。我已经按照您所描述的那样做了,但是错误现在变为:CGBitmapContextCreate:invalid data bytes/row:对于8个整数位/组件、3个组件、kCGImageAlphaNoneSkipLast,应该至少为7744。
+1对于非常棒的提示—“如果数据传递NULL,您也可以在这里传递0,让它自动为您计算。”它可以工作,但我在文档中找不到它的引用。tho,你有吗?它就在CGBitmapContextCreate函数的文档中,请看bytesPerRow参数的描述。是的,我不知道我怎么会错过它!