在iPhone上缩放和裁剪巨大的图像

时间:2009-12-11 21:13:36

标签: iphone image tiles scale crop

在过去的几个星期里,我一直在试图让我的头发试图在iPhone上使用平铺机制。我需要缩放和裁剪大约150mb的图像,以便将它们保存为滚动视图请求的图块,允许用户以高分辨率查看图像。

问题在于这些图像真正推动了iPhone可以处理的范围。将这些巨大的图像缩小到1000左右并进行平铺似乎很容易,但对于大的缩放级别,我需要在中途缩放它,比如说4000对,这太大了。所以我想到了从全尺寸图像中制作中等大小的块,然后平铺每个块和中等缩放。

通过在内循环周围创建自动释放池,并在每个循环后将其耗尽,我可以大部分时间控制内存,但有时候,对我而言似乎是随机的,内存会泄漏,或者至少不会耗尽。我在辅助线程上做这一切,当它返回到该线程中的第一个函数时,我释放线程自己的自动释放池,然后才清除最后的内存工件。它似乎没有打扰模拟器,但iPhone的宽容度要低得多,并且在完成整个平铺过程之前它会崩溃。我使用的裁剪代码来自Hive05

http://www.hive05.com/2008/11/crop-an-image-using-the-iphone-sdk/

以前有没有其他人必须处理如此庞大的图像?预生成瓷砖是最好的方法吗?有关为什么某些循环会增加内存而某些循环没有的建议,或者如何强制每个自动释放的东西在内部池上清除而不是等待外部池?

感谢您阅读此内容。

要添加,这些图像是TIF,所以也许直接读取位图信息会比缩放和裁剪整个事情更好

2 个答案:

答案 0 :(得分:0)

首先,我怀疑150 MB的图像是否适合设备的内存,即使我们正在谈论3GS。对于第三方应用最大,该可用内存大约为128 MB。查看设备控制台消息并查找内存警告,我想您会在崩溃之前看到该应用程序在尝试加载图像时发出它们。以块的形式读取位图信息似乎更合理,因为您将一次管理较小的部分。我不认为Cocoa有随机访问文件API,所以你不得不求助于C函数。

答案 1 :(得分:0)

我设法编写了循环遍历1024x1024的磁贴的循环,我的iPhone 3G能够完成处理。它需要30多分钟,所以它不是很好,但这就是你在手机上使用150mb TIF所能得到的。

为了保持低内存使用率,我不得不在每次迭代后耗尽AutoReleasepools。 Apple技术支持指出,由于iPhone是一个引用计数环境而不是垃圾收集环境,最好在每个内循环开始时创建一个新的AutoReleasePool,并在每个循环结束时将其排出,而不是在之前创建它任何循环开始,排出多次,然后在循环完成后释放它。在我做出改变之前,我的应用程序会崩溃iPhone,但在模拟器上运行正常。