iPhone中Png圖片格式的秘密


有時候我們看到一個App,想看看他的一些界面是如何實現的,這個時候需要查看一下它的圖片資源,不過iOS的png圖片編譯后一般的圖片閱讀器都是沒法查看的,本文將告訴的原因和轉換出原圖的方法(得安裝XCode)。

ipa 解壓,將png相關文件夾拷貝出來,在命令行下使用/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush -revert-iphone-optimizations xxx.png yyy.png

我們都知道一個編譯好的iPhone app 其中的png圖片一般普通的圖片閱讀器是無法直接讀取的,這是因為XCode在編譯的過程中,將圖片進行了優化,實際上它已經不是一個png圖片了。
這邊有一些apple iPhone png自己格式的一些說明
http://iphonedevwiki.net/index.php/CgBI_file_format

在Png數據中,我們最關心的莫過於png的數據塊,其中包含了png每一個像素的信息,當然了為了減少存儲空間,這些像素信息都是壓縮保存的。而且是使用zlib進行壓縮的,壓縮后 包含zlib header 信息,還有由於解壓驗證的crc信息。
而iPhone的CgBI格式的png則將原始的png圖片作如下變化:

  1. 增加一個新的關鍵塊 CgBI Chunk 四個字節
  2. zlib的header和CRC信息全部從IDAT中移除
  3. 紅藍交換,每一個像素(RGBA)中的R和B進行調換變成BGRA ,解壓后每一個像素有四個字節組成,也就是將每一個像素的 第一個字節和第三個字節調換
  4. 透明像素處理 Premultiplied Alpha ,這個的意思是為了圖像加載變得更快,預先將Alpha的信息乘到像素的顏色信息中去,這樣后期計算的時候就可以減少CPU或者GPU計算了

把一個正常的PNG圖片優化成iPhone 的png圖片格式可以使用XCode自帶的工具 /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush -iphone
還有一個第三方的開源工具也可以
https://github.com/DHowett/pincrush

 

如果你想把一個經過優化后的圖片還原成普通圖片閱讀器可以查看的png圖片,就是對上面的過程進行反向處理。
現在可以找到的第三方的轉換的一般有如下幾個
ipin.py(Python版本) http://www.axelbrz.com.ar/?mod=iphone-png-images-normalizer
iPhonePNG(C版本) http://www.newsfirerss.com/blog/?p=176

經過本人測試,上面的這種第三方的額轉換工具都沒有對alpha相關的做任何處理,也可以是別的原因,有一些圖片轉換后的結果和原始圖片還是有些出入的。
原圖(Flip Board中的一個按鈕背景圖):

編譯后如果使用第三方的python或者C版本的代碼來轉換,轉換后的圖片都是這樣的,感覺邊角的像素有點問題,不過大部分情況下 ,圖片都是ok的

我嘗試通過修改第三方的代碼,想將Premultiplied Alpha 還原過去,但是還是存在各種問題,最終沒有結果。
只能最終采用XCode自帶的工具進行轉換 /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush -revert-iphone-optimizations 1.png 2.png
這個pngcrush是apple改自開源的pngcrush 只可惜蘋果修改后的版本卻沒有開源出來。

為了避免每次都需要在命令行中進行操作,你可以通過automator新建一個shell的service

for path in "$@"
do
mv "$path" "$path".tmp
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush -revert-iphone-optimizations "$path".tmp "$path"
rm "$path".tmp
done

當然你可以修改腳本,並可以作用於文件和文件夾,對目標進行判斷,文件夾則遞歸文件夾中的png文件進行逐個處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM