0

我们有从 PNG 数据提供者创建 CGImage 的代码,然后在 CGBitmapContext 上绘制它。大多数 PNG 工作正常,但不支持某些 PNG 格式(请参阅此处),因此我们得到一个 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)?

4

1 回答 1

2

第一: UIImage现在是线程安全的。从文档

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

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

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

于 2013-02-07T15:18:19.300 回答