我正试图在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);