2009-04-29 80 views
9

我從相機膠捲中抓取圖像,然後使用它一段時間,並將其作爲iPhone上的PNG保存到磁盤。我正在發生奇怪的事故,大概是由於內存不足。jpg或png用於UIImage - 哪種效率更高?

如果我將它保存爲PNG或JPG(假設我選擇註釋以降低JPG格式的質量),它有什麼區別嗎?具體來說:

  • 是更多的內存,然後使用UIImage後我重新加載它的磁盤,如果我把它保存爲PNG?
  • 是否有可能因爲PNG在保存過程中暫時使用更多內存而進行保存?

我一直假設UIImage是一個格式中立表示,它應該沒關係,但我認爲我應該驗證。

回答

10

我有一個商店的應用程序需要保存圖像的中間版本,因爲它正在被編輯。在原始版本中,我使用PNG格式進行保存,以避免多次加載並保存JPEG所造成的質量損失。

在2.2軟件版本發佈的某個時候,Apple向PNG寫入代碼引入了一項更改,使得從某些圖像保存PNG數據需要多次。我最終不得不改變爲以JPEG格式保存,因爲我的應用程序在退出時嘗試保存圖像時超時。

此外,您將遇到問題,因爲以PNG格式保存不會保留UIImage中的「方向」信息,因此使用內置相機以縱向拍攝的照片將在保存後出現旋轉重新加載它。

0

我沒有任何硬數據,但我認爲PNG是可取的,因爲蘋果似乎幾乎在iPhone操作系統中隨處使用PNG。

但是,如果您已經設置了用於編寫PNG的代碼,那麼將它改爲寫入JPEG應該不會太難嗎?試試這兩種方法,看看哪個更好。

5

這取決於你正在處理的圖像類型。如果您正在處理照片圖像,JPEG幾乎總是會比PNG小,並且沒有可察覺的細節損失,如人眼所見。相反,如果您要處理的是高度非照片圖像(如GUI元素或具有大塊純色的圖像),那麼PNG和JPEG的大小可比,但PNG將無損保存,而JPEG將是有損的,並有非常明顯的文物。如果你真的有一個真的簡單的圖像(非常大的恆定顏色塊,例如),那麼PNG很可能會比JPEG小得多,並且不會有任何壓縮僞像。

將圖像保存爲PNG或JPEG的行爲不應占用過多的瞬態內存。當圖像存儲在內存中時,通常將其無壓縮地存儲在內存中,以便可以非常快速地將其拖到屏幕上,而不必在每次渲染時都對其進行解壓縮。與未壓縮映像的大小相比,您需要壓縮的額外臨時存儲量非常小。如果您可以將未壓縮的圖像放入內存中,則不必擔心在壓縮時使用的內存。

當然,一旦您將圖像寫入文件系統的非易失性存儲並釋放內存映像,壓縮映像的大小並不重要,因爲它不佔用內存主要記憶。壓縮映像的大小僅影響其使用的閃存存儲量,這可能是一個問題,但它不會影響您的應用程序運行內存不足的可能性。

+0

這很有道理。當我保存用iPhone拍攝的照片時,會導致奇怪的問題,但是當使用相對簡單的矢量圖像的PNG時,即使是非常大的圖像也沒有問題。 – 2009-04-29 05:25:00

24

我正在奇怪崩潰,這可能是由於內存不足


然後停止自己在做什麼,現在和首先要弄清楚,如果這實際上是導致事故的原因。否則,你很有可能在這裏追查錯誤的問題,修復一個不存在的內存問題,而忽略崩潰的真正原因。如果你想修復崩潰,首先確定是什麼導致了崩潰。跟進什麼「大概」這個問題是浪費時間和精力的祕訣。

+2

不能同意這一點。如果你發生崩潰,你不能只是扔一堆東西,希望有一些東西粘在上面 – rpetrich 2009-04-29 18:15:36

0

儘可能使用PNG。作爲編譯的一部分,XCode通過一個實用程序(pngcrush)運行所有的PNG文件來壓縮和優化它們。

0
  1. 是更多的內存然後由UIImage的後,我重新加載它關閉 盤的,如果我救它作爲一個PNG? =>不,如果您從2張具有相同分辨率和相同通道數的圖像導入,則它的內存大小相同。 (如RGBA)
  2. 是否有可能因爲PNG在保存過程中暫時使用更多內存而進行保存? =>不,它隻影響你的磁盤內存。