2009-10-02 15 views
0

我有一個UIImage正在充滿來自iPhone相機的圖像。是否可以使用較小的內存佔用量來製作UIImage?

由於圖像具有2048x1536像素,因此會消耗大量內存。

  1. 我希望這個形象是24位,而不是32位,但我不知道。所以這是第一個問題。來自iPhone攝像頭的圖像是24位還是32位?
  2. 第二個問題是:如果圖像是32位,我怎樣才能使它24位到相同的內存?
  3. 第三個問題是:在將其分配給變量以節省空間之前,我是否可以對該圖像做任何事情,而不更改其尺寸

請不要涉及OpenGL的解決方案。

在此先感謝。

回答

1

如果不在內存中存儲該圖片並創建第二個緩衝區來存儲修改後的版本,您可以執行的操作並不多。我相信第二個緩衝區可以包含更少的每個顏色位,甚至可以跳過alpha值。如果你使用每種顏色4比特,你可以削減原來的50%,這不包括節省,如果你擺脫了阿爾法。

一組簡單的調用會告訴你在圖片中的信息是什麼,如每個色彩位,是否包括了阿爾法:

CGImageAlphaInfo CGImageGetAlphaInfo (
    CGImageRef image 
); 

返回值 一個CGImageAlphaInfo常量,指定( 1)位圖是否包含阿爾法通道,(2)阿爾法位位於圖像數據中,以及(3)阿爾法值是否是預乘。有關可能的值,請參見「常量」。如果圖像參數引用圖像蒙版,則函數返回kCGImageAlphaNone。

size_t CGImageGetBitsPerComponent (
    CGImageRef image 
); 

返回值 在存儲器用於指定的位圖圖像(或圖像掩模)的每個顏色分量的比特數。可能的值是1,2,4或8.例如,對於16位RGB(A)色彩空間,該函數將返回每個顏色分量4位的值。

size_t CGImageGetBitsPerPixel (
    CGImageRef image 
); 

返回值 在存儲器用於指定的位圖圖像(或圖像掩模)的每個像素的比特數。

這應該讓你開始看看圖像是由什麼組成的。要以更少的位重新創建它,需要更多的工作,並暫時需要更多的內存,直到可以丟棄原始圖像爲止。

+0

感謝您的回答!還有一個問題。我正在檢查來自相機的照片。他們沒有阿爾法,但爲什麼他們是32 ppp?我如何將它們轉換爲24 bpp? – SpaceDog 2009-10-02 19:45:33

+0

我認爲他們在32 bpp中,因爲讀取字邊界數據更快?那麼問題是,處理24bpp圖片的速度是否值得節省25%的空間。 – mahboudz 2009-10-05 19:33:58

0

(這是不是一個真正的答案,但更多的是觀察)

的圖片是大小將消耗大約12 MB的空間,未壓縮的原始數據。

2048 * 1536 = 3,145,728像素。

每個像素需要1個字節的紅色數據,1個字節的綠色數據,1個字節的藍色數據和1個字節的透明度= 4個字節/像素。

3145728 * 4 = 12,582,912字節=恰好12MB。

對於iPhone而言,這確實是一大塊記憶,而且我懷疑你會做很多事情來解決這個問題(禁止一次從磁盤讀取圖像的片段,但取決於你的使用情況下,這可能會真的殺死電池)。

+0

是否有任何方法可以從攝像頭中刪除alpha圖像以節省內存?誰需要全屏不透明圖像中的alpha? – SpaceDog 2009-10-02 06:19:41

相關問題