2013-08-05 35 views
6

我试图按照以下步骤创建一个8位灰度背景:CGBitmapContextCreate:不支持的参数组合

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. 

这是为什么不支持相结合?

回答

7

每组件支持的比特,每个像素的位数,色彩空间组合可以见于“Quartz 2D Programming Guide

作为尼古拉写道,使用kCGBitmapByteOrder32Little与kCGImageAlphaNone不会使灰度颜色空间感(和不支持) 。

现在根据你的每行和每个字节的字节数,你需要在你的数据参数中提供足够的分配内存给CGBitmapContextCreate。你没有在代码中设置高度并为数据分配内存,但我想你的问题在那里。

另外,根据CGBitmapContextCreate文档,您实际上并不需要自己分配内存(截至iOS 4.0),您可以将NULL作为数据传递给您分配内存。您仍然可以通过使用CGBitmapContextGetData来请求数据指针。

另一个需要注意的是,通过m_width作为bytesPerRow在这种情况下是正确的(每个像素1个字节的灰色空间),但可能并不是很好的做法。如果您为数据传递NULL,您也可以在这里传递0来自动计算。

+1

+ “如果你传递NULL作为数据,你也可以在这里传递0来让它自动计算出来。”它的工作原理,但我找不到在文档中提到它,你有吗? – Robert

+0

在CGBitmapContextCreate函数的文档中,请查看bytesPerRow参数的说明。 – danielv

+0

是的 - 我不知道我错过了那个! – Robert

2

这可能是kCGBitmapByteOrder32Little(这对于单通道灰度图像没有任何意义)。

你可以从像素格式规范中删除它。

+0

感谢您的回答。我已经按照你所描述的完成了,但是现在的错误改为: 'CGBitmapContextCreate:无效的数据字节/行:对于8个整数位/分量,3个分量kCGImageAlphaNoneSkipLast,至少应该为7744.' –

相关问题