如何在Core Graphics中绘制任何PNG格式

时间:2013-02-07 14:39:39

标签: ios png core-graphics

我们有代码从PNG数据提供程序创建CGImage,然后在CGBitmapContext上绘制它。大多数PNG工作正常,但不支持某些PNG格式(请参阅here),因此我们得到一个NULL上下文。这就是我们创建它的方式:

CGContextRef imageContext = CGBitmapContextCreate(NULL, width, height, CGImageGetBitsPerComponent(image), 0, CGImageGetColorSpace(image), CGImageGetBitmapInfo(image));

现在,虽然这种方式在Core Graphics中不起作用,但使用相同的PNG制作UIImage也可以。我们手动确认确实不支持给定的PNG格式(24 bpp,8 bpc,仅RGB(无alpha通道))。此外,传递kCGImageAlphaPremultipliedFirst的CGBitmapInfo有效!

所以,似乎有一种方法可以使迷失的PNG渲染,UIImage实现了这一点。但是我们真的不能在这里使用UIImage(我们想在后台线程上预渲染位图),因此问题是 - 在Core Graphics中渲染所有PNG有什么好的启发式算法?或者,我们可以使用哪些其他绘图技术来实现相同的效果(但不使用Core Graphics)?

1 个答案:

答案 0 :(得分:2)

首先: UIImage现在是线程安全的。 From the docs

  

这也意味着图像对象本身可以安全地使用   线程。

第二:您的问题仅在于有限数量的可用CGBitmapContext像素格式。

如果你总是使用32bpp,RGB与预乘alpha一切都应该工作。当然你不会得到PNG的原始像素格式(如调色板,B& W或其他),但这通常无关紧要,因为在屏幕上绘制图像是用RGB完成的。