在这个CGBitmapContextCreate中,为什么bytesPerRow为0?

时间:2011-06-23 15:39:03

标签: objective-c ios core-graphics

我注意到在Apple的示例代码中,它们通常在CGBitmapContextCreate的bytesPerRow参数中提供值0。例如,这来自Reflection示例项目。

CGContextRef gradientBitmapContext = CGBitmapContextCreate(NULL, pixelsWide, pixelsHigh,  
                                                            8, 0, colorSpace, kCGImageAlphaNone);

这对我来说似乎很奇怪,因为我总是把图像宽度乘以每个像素的字节数。我尝试将零交换到我自己的代码中并进行测试。果然,它仍然有效。

size_t bitsPerComponent = 8;
size_t bytesPerPixel = 4;
size_t bytesPerRow = reflectionWidth * bytesPerPixel;   

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL,
                                             reflectionWidth,
                                             reflectionHeight,
                                             bitsPerComponent,
                                             0, // bytesPerRow ??
                                             colorSpace,
                                             kCGImageAlphaPremultipliedLast);

根据文档,bytesPerRow应该是“每行位图使用的内存字节数。”

那么这笔交易是什么?我何时可以提供零,何时必须计算确切的值?以某种方式做到这一点有什么性能影响吗?

1 个答案:

答案 0 :(得分:8)

我的理解是,如果传入零,它会根据bitsPerComponent和width参数计算每行的字节数。您可能希望在每行字节的末尾添加额外的填充(如果您的设备需要它,或者其他一些约束)。在这种情况下,您可以传递一个大于* *(每个像素的字节数)的值。我想在现代i / MacOS开发中可能永远不需要这样做,除了一些奇怪的边缘情况优化。