2009-12-11 82 views
0

在过去的几周里,我一直在试图让我的头发在iPhone上工作。我需要缩放和裁剪大约150mb的图像,以便将它们保存为滚动视图所要求的图块,以便用户以高分辨率查看图像。在iPhone上缩放和裁剪巨大的图像

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

通过在内部循环周围创建一个autoreleasepool,并在每个循环之后对其进行排空,但我可以控制内存,但有时对我来说似乎是随机的,内存泄漏或至少不会排空。我在辅助线程上完成了所有这些工作,当它返回到该线程中的第一个函数时,我释放线程自己的autoreleasepool,然后才清除最后一个内存工件。它似乎并没有打扰模拟器,但iPhone的宽容度要小得多,而且它在完成整个平铺过程之前崩溃了。裁剪的代码,我现在用的就是从Hive05

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

任何人都有前应对如此大规模的图像?预先生成瓷砖是最佳方式吗?任何关于为什么一些循环会增加内存和一些不会,或者如何强制每个自动释放的内容清除内部池而不是等待外部池的建议?

感谢您阅读这篇文章。

为GOT增加,这些图像是TIFS,所以也许位图信息的直接读数会比缩放和裁切整个事情

回答

0

我已经设法编写了可以循环浏览1024x1024瓦片的循环,并且我的iPhone 3G能够完成处理。它需要30多分钟的时间,所以它不是很好,但这是你在手机上使用150MB TIF的工作。

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

0

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

+0

它绝对可以在iPhone 3G上完成。这就是我所拥有的,我可以在一切中等大小的块之前平铺一些中等大小的块。基本上,如果它可以平铺一个,它可以将它们全部平铺。我只需要正确清理中间的内存并重复此过程。 我一直非常沮丧,试图让循环不留下任何东西我认为C函数可能是下一步,但我不知道如何继续。 – Craig 2009-12-12 00:27:55