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

Gre*_*g W 5 core-graphics objective-c ios

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

CGContextRef gradientBitmapContext = CGBitmapContextCreate(NULL, pixelsWide, pixelsHigh,  
                                                            8, 0, colorSpace, kCGImageAlphaNone);
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*ieb 8

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

  • 听起来很合理.如果Apple在某个地方的文档中澄清这一点会很好(如果它在那里,我无法找到它).我发现过于依赖无证的行为有些令人不安. (2认同)