【问题标题】:UIImage with Large image size - Memory Problem - Crash具有大图像大小的 UIImage - 内存问题 - 崩溃
【发布时间】:2011-03-27 08:00:14
【问题描述】:

我想加载并显示具有大尺寸的图像(.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." 吗?如何在位图支持的图形上下文上绘制图像?什么是位图支持的图形上下文?如果有人可以共享示例代码,那将对我有所帮助。 提前致谢!!

【问题讨论】:

    标签: iphone crash uiimage memory-management


    【解决方案1】:

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

    发生“限制”是因为 UIViews 是使用 CALayers 渲染的,而 CALayers 在 GPU 上被渲染为纹理多边形,并且 GPU 具有最大纹理大小(这在 iPhone 2G/3G 和大概 iPod Touch 上似乎是 2044 像素1G/2G)。他们在 3GS 及更高版本的设备上增加了它,大概是因为相机拍摄的图片更大。

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

    【讨论】:

      【解决方案2】:

      听起来您应该避免将整个图像存储在内存中,即使是很短的时间。

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

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

      【讨论】:

        猜你喜欢
        • 2015-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-06
        • 2012-06-17
        相关资源
        最近更新 更多