1

我正在学习如何绘制 UIImages 和 CGI​​mages,使用 CIFilters 等。为了测试我的知识,我制作了一个带有滑块的小型测试应用程序,它以编程方式更改药水精灵的颜色并将其显示在屏幕上(使用 CIHueBlendMode CIFilter)。完成后,我想清理相对冗长的代码,并注意到我可以使用 UIImage 的 imageWithCIImage: 方法直接从 CIImage 到 UIImage,而不是从过滤器输出的 CIImage 到 CGImage 再到 UIImage。

但是,当我尝试使用 drawInRect: 绘制生成的 UIImage 时,没有绘制任何内容。当然,通过 CGImage 阶段可以纠正这一点。我对此的理解是,从 CIImage 制作 UIImage 会导致 UIImage 中的 NULL CGImage 属性,该属性用于 drawInRect:。它是否正确?如果是这样,有没有比通过 CGImage 和 UIImage 更好的方法来显示 CIImage?我可以只画一个用 CIImage 制作的 CGImage,但这会翻转图像,这会导致另一个问题。目前,我首先将我绘制的任何内容包装在 UIImage 中以处理翻转。还有其他更有效的方法吗?

太长; 未读:有没有更好的方法来绘制 CIImage,而不是将它变成一个 CGImage,然后是一个 UIImage 并绘制它?绘制 CGImage 时处理翻转的最佳方法是什么?

感谢任何可以回答我的一些问题的人。:)

4

1 回答 1

1

在对什么是 CIImage 进行了一些研究之后,我现在意识到你不能跳过从 CIImage 制作 CGImage 的步骤,即使你可以,它也不会真正变得更有效率,因为你仍然必须无论如何处理CIImage。正如 Apple 文档中所述, CIImage 并不是真正的图像,它是在变成 CGImage 时进行处理的。这也是为什么如果我在我的项目中使用 Time Profiler,我会看到我在 drawRect: 方法中 99% 的时间都花在了 createCGImage: 上,而不是使用 CIFilters。

至于应对 Core Graphics 和 iPhone 之间坐标系变化的最有效方法,似乎将对象包装在 UIImage 实例中是最简单(不确定最好)的方法。它很简单,而且相对有效。另一种选择是转换图形上下文。


如果我在三天内没有得到比我自己更好的答案,我会将其标记为已接受。

于 2012-09-08T04:33:55.793 回答