具有大图像大小的UIImage - 内存问题 - 崩溃

时间:2010-08-09 14:14:57

标签: iphone crash uiimage memory-management

我想加载并显示大尺寸的图像( .jpg, .png),例如1800x1200或2000x1800(宽x高)。 如果我在UIImageView中显示如此大尺寸的图像(1800x1200或2000x1800),它也会占用大量内存,应用程序也会崩溃。 另外,根据Apple的文档(http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html),我们应该避免创建大小超过1024 x 1024的UIImage对象。 一种解决方案是调整图像大小。我已经应用逻辑来使用以下代码调整图像大小。

UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

这样可以正常工作并调整图像大小。但是当它在设备上下文中加载大图像来调整大小时,它会消耗大量内存一秒钟,因为应用程序崩溃了。 所以这种方法不起作用。如果您有更好的方法来调整大小而不会崩溃,请分享。

同样在这个(http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html)链接中,Apple说

  

“你应该避免创建大小超过1024 x 1024的UIImage对象。除了这些图像会占用大量内存之外,在OpenGL ES中或在绘图时将图像用作纹理时可能会遇到问题图像到视图或图层。如果您正在执行基于代码的操作,则此大小限制不适用,例如通过将大小超过1024 x 1024像素的图像绘制到位图支持的图形上下文来调整大小。事实上,您可以需要以这种方式调整图像大小(或将其分成几个较小的图像),以便将其绘制到您的一个视图中。“

有人可以详细说明"This size restriction does not apply if you are performing code-based manipulations, such as resizing an image larger than 1024 x 1024 pixels by drawing it to a bitmap-backed graphics context."吗?如何在位图支持的图形上下文中绘制图像?什么是位图支持的图形上下文?如果有人可以共享示例代码,这对我有帮助。 在此先感谢!!

2 个答案:

答案 0 :(得分:4)

UIGraphicsBeginImageContext()创建一个由位图支持的图形上下文(在它下面调用CGBitmapContextCreate)。

“限制”的发生是因为UIViews使用CALayers呈现,而CALayers在GPU上呈现为纹理多边形,而GPU具有最大纹理大小(在iPhone 2G / 3G上看起来像是2044像素,可能是iPod Touch 1G / 2G)。他们在3GS和后来的设备上增加了它,大概是因为相机的照片更大。

那就是说,你应该能够毫无问题地操纵单个相机大小的图像;崩溃表明你在其他地方使用了大量内存(可能是内存泄漏?)。

答案 1 :(得分:1)

听起来你应该避免将整个图像留在记忆中,即使这只是一段时间。

我不知道你的图像来源是什么,但也许你可以将它存储成碎片(瓷砖或条带)。要显示,请逐个加载条带并将它们绘制到相同的基于图像的上下文中。

如果您打算进行缩放,那么CATiledLayer可以为您提供很多帮助。请参阅WWDC'10会议中有关滚动视图的视频。这是最具启发性的。