2010-08-09 70 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會議中關於滾動視圖的視頻。這是最有啓發性的。