2010-08-09 71 views
3

我想加载和显示图像(.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对象。 一个解决方案是调整图像大小。我已经应用逻辑来使用以下代码调整图像大小。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)链接,苹果公司表示,

“你应该避免创建于1024×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."吗?如何在位图支持的图形上下文上绘制图像?什么是位图支持的图形上下文?如果有人可以共享示例代码,它会帮助我。 在此先感谢!

回答

4

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

发生“限制”是因为UIView使用CALayers呈现,而CALayers在GPU上呈现为纹理多边形,并且GPU具有最大纹理大小(这似乎是iPhone 2G/3G上的2044像素,推测可能是iPod触摸1G/2G)。他们已经在3GS和更高版本的设备上增加了它,可能是因为来自相机的图片更大。

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

1

听起来像你应该避免在内存中有整个图像,即使它很短时间。

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

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