在这个CGBitmapContextCreate中,为什么是bytesPerRow 0?
我注意到在苹果的示例代码中,他们通常在CGBitmapContextCreate的bytesPerRow参数中提供值0。 例如,这来自reflection示例项目。
CGContextRef gradientBitmapContext = CGBitmapContextCreate(NULL, pixelsWide, pixelsHigh, 8, 0, colorSpace, kCGImageAlphaNone);
这对我来说似乎很奇怪,因为我一直走图像宽度乘以每个像素的字节数的路线。 我尝试在零代码中交换我自己的代码并进行testing。 果然,它仍然有效。
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应该是“位图的每行使用的内存的字节数”。
那么交易是什么? 什么时候可以提供一个零点,何时必须计算确切的值? 这样做有没有任何性能影响?
我的理解是,如果你通过零,它计算基于bitsPerComponent和宽度参数的每行字节数。 您可能需要在每行字节的末尾添加填充(如果您的设备需要它或其他约束)。 在这种情况下,您可以传递的值不仅仅是宽度*(每个像素的字节数)。 我想这可能是现代i / MacOS开发中不需要的,除了一些奇怪的边缘情况优化。