8

我見過這個問題,問幾十次,但從未回答。在內存較小的iPhone上調整UIImage的大小

如何調整UIImage(特別是從UIImagePickerController攝像頭返回的)的大小。當我嘗試使用任何方法時,我會得到20到40MB的內存峯值。它確實消失了,但我知道在某些硬件上這是完全不可接受的。

我已經嘗試使用以下操作方法:drawInRect:,CGContextDrawImage(),imageWithCGImage:規模:定位:

我明白,生活在記憶非壓縮圖像佔用更多的空間比在磁盤上,但它看起來像最常見的UIImage調整大小操作涉及創建圖像數據的副本。即使Apple建議立即調整使用相機拍攝的照片的大小。然而(B/C我相信他們知道這個主題非常複雜),但他們沒有提供關於如何管理這個問題的指導。特別是在圖像數據返回的時候如何做到這一點。

有沒有人有一個平滑的方法來調整大UIImage的大小,同時保存內存?我知道這是一個很高的命令。

+1

還有什麼想法?我可能會把這一個發給蘋果公司。 – sambecker 2010-08-03 03:59:07

回答

0

我沒有100%的很好的答案,但你有幾個選項。 iPhone會讓你進入編輯/剪裁等模式。我想這就是蘋果希望你使用的。對我們來說這是不可接受的。我們抓取圖像數據,獲取像素數據,釋放原始圖像。然後調整上半部分,然後重新調整自己。我會張貼一些代碼,但沒有工作。我可以在度假後的幾天...

+1

根據「獲取」像素數據的方式,這可能會產生不必要的副本(一旦進入「UIImage」並再次進入緩衝區) – rpetrich 2010-08-02 02:10:07

1

一個使用少量內存的方法是創建一個位圖上下文與CGBitmapContextCreate並繪製UIImage到它。這將使用的唯一額外內存是你已經malloc ed和一些小的CGContext開銷。

如果你想獲得幻想,你可以改爲mmapPROT_WRITE標誌設置,並只能通過虛擬地址空間

+0

我試過這種方法,但無法保存內存。是否有一個特定的保留/釋放模式,以可以共享的UIImage開始和結束? – sambecker 2010-08-02 15:12:36

+1

我沒有任何代碼示例,因爲我只是在我的越獄應用程序中使用更簡單的私有API。上面的代碼將爲您調整大小的圖像到您選擇的緩衝區中。要創建一個'UIImage',鏈接下列API:'CGDataProviderCreateWithData','CGImageCreate'和' - [UIImage initWithCGImage:]'。一定要遵循適當的內存管理模式,併爲你的'CGDataProvider'指定一個適當的自定義釋放回調。 – rpetrich 2010-08-04 16:29:55

1

限制你試過基準由與類方法調整UIImage使用的內存佔用描述在以下博客post

我已經使用類似的大小調整來縮放應用程序下載的較大圖片的縮略圖。我的照片可能不像您從圖像選取器控制器中選取的照片那樣大,但是我發現了相當不錯的效果。

希望它有助於某種方式。

0

您的圖片可能比我在應用中處理的圖片更大,但您不會說我們正在討論的尺寸。我只能建議Quartz或您自己的調整大小過濾器逐行執行圖片。

1

這是一些覆蓋UIImage大小的git項目。我使用第二個,它像一個魅力。它有一個很好的示例項目,所以你可以看到如何使用它。我認爲第一個也有一個樣本,儘管我沒有嘗試使用它或仔細觀察。

https://github.com/coryalder/UIImage_Resize

https://github.com/AliSoftware/UIImage-Resize

如果你真的關心內存佔用,你可以做一些瘋狂十歲上下像調整圖像大小的塊,並在內存拼接他們重新走到一起......但是這可能只適用於非常大的圖像。使用可用的內存,應該可以正確處理來自內置相機的照片。

相關問題