为什么CGBitmapContextCreate期望的字节数是PerRow的两倍



我正试图在iOS上(在ObjC中(使用位图上下文生成像素缓冲区。节略代码(删除空检查等(如下。

CGFloat width = 1;
CGFloat height = 1;
CVPixelBufferRef buffer;
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, 
width, 
height,  
kCVPixelFormatType_OneComponent8,
nil, 
&buffer);
CVPixelBufferLockBaseAddress(buffer, 0);
void *data = CVPixelBufferGetBaseAddress(buffer);
CGColorSpaceRef space = CGColorSpaceCreateDeviceGray();
CGContextRef ctx = CGBitmapContextCreate(data, 
width, 
height, 
8, 
0, 
space, 
(CGBitmapInfo) kCGImageAlphaNoneSkipLast);
// ... draw into context
CVPixelBufferUnlockBaseAddress(buffer, 0);

这是试图为单个像素创建位图上下文,其中输入和输出像素都是8位灰度。

我得到以下输出(我添加了粗体(:

CGBitmapContextCreate:无效数据字节/行:对于8个整数位/组件、1个组件、kCGImageAlphaNoneSkipLast,应至少为2。

为什么每行的字节数是预期的两倍?这与我尝试过的宽度/高度组合是一致的,如果我将CGBitmapContextCreate中的宽度参数减半,则"有效"。还要注意,如果我为bytesPerRow传递一个值,那么它仍然无法通过此检查并给出相同的输出。

我是不是错过了一些显而易见的东西?

编辑:格式化

kCGImageAlphaNoneSkipLast错误。我需要使用kCGImageAlphaNone

位图创建调用现在看起来像:

CGContextRef ctx = CGBitmapContextCreate(data, 
width,
height, 
8,
CVPixelBufferGetBytesPerRow(buffer),
space, 
kCGImageAlphaNone);

最新更新