处理超高分辨率图像的最佳方法是什么?

时间:2012-09-17 11:35:25

标签: iphone ios ios5 iphone-4 iphone-3gs

我正在开发一款应用,它需要使用分辨率高于(2000 x 2000)的图像,以达到文字清晰度。

我有一个背景图像,我需要在其上显示具有相同分辨率的叠加图像。叠加的数量是可变的,从2到30.

使用UIImage加载图像时,每个像素需要4个字节,因此如果一个图像的分辨率为3000x3000,则需要最多34 MB的内存,15 MB的2000 x 2000。

在问题出现的地方,应用程序在3GS上加载4-5张图像后崩溃,在iPhone 4上加载11-13张图像。

需要将叠加层准确放置在背景图像上。它们就像我们在Google地图流量叠加层中所拥有的一样。这并不排除平铺,但使任务相对复杂。

我该如何处理这个问题?

1 个答案:

答案 0 :(得分:0)

当然,您无法立即将整个图像集加载到内存中。 您只需要加载图像数据的可见部分,并且应该尽快卸载不可见部分。

如果你想在QuartzCore级别解决这个问题,那么CATiledLayer类只是为了这个目的。

Apple参考:https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html

Apple示例代码:https://developer.apple.com/library/mac/#samplecode/CALayerEssentials/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008029

其他信息:http://red-glasses.com/index.php/tutorials/catiledlayer-how-to-use-it-how-it-works-what-it-does/

要使用此图层,您需要将源图像拆分为多个图块。并在层需要时提供它们。 (drawLayer:inContext:方法。)该方法将在非主线程上调用,因此不会阻止用户界面。不要忘记释放隐形瓷砖的图像以节省内存。

此外,您可以使用低级OpenGL代码实现此功能,并使用后台线程加载动态资源。在这种情况下,您可以使用PVRTC有损内存压缩,这可以大大节省视频内存使用量,但这真的很痛苦,而且耗时很长。我建议使用CATiledLayer。对于大多数情况来说这已经足够了。