在drawRect:中从CIImage绘制UIImage



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

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

太长;没有阅读:除了将CIImages转换为CGImage,然后再转换为UIImage并绘制它之外,还有更好的方法来绘制CIImages吗?绘制CGImages时,处理翻转的最佳方法是什么?

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

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

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


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

最新更新