標籤:
Android手機和iPhone有很多相比較的地方。我們無法做出哪個更好的結論,但是我們都知道Android手機圖片的品質是比iPhone差的。無論你是用Facebook、Twitter甚至是Instagram,拍完照片,加個濾鏡,然後分享到社交平台,Android手機產生的圖片總是很粗糙。為什麼呢?
從去年開始,我們的團隊就這一點已經工作了一年。經過深入的研究,這是由於Google的一個“很小的”錯誤導致的。雖然是個很小的錯誤,但它的影響卻是非常大的(所有的Android應用都涉及到圖片),並且一直延續到了今天。
問題就是:libjpeg
我們都知道libjpeg是被廣泛地應用到各種開源的圖片庫中。Android也使用libjpeg去壓縮圖片。在深入挖掘了Android的源碼之後,我們可以發現相比於直接使用libjpeg庫,Android是基於一個叫Skia的開源圖片引擎。Skia是一個由Google維護的很棒的引擎,它涉及到了所有的圖片功能。它被廣泛地使用到Google和其他公司的產品中,比如Chrome、Firefox、Android等。Sika具有良好的封裝性,在它的基礎上,你可以很容易地開發圖片工具。
當我們使用libjpeg去壓縮圖片時,optimize_coding 是一個非常重要的參數。在libjpeg的文檔中,我們可以發現該參數的介紹如下:
boolean optimize_coding
TRUE causes the compressor to compute optimal Huffman coding tables for the image. This requires an extra pass over the data and therefore costs a good deal of space and time. The default is FALSE, which tells the compressor to use the supplied or default Huffman tables. In most cases optimal tables save only a few percent of file size compared to the default tables. Note that when this is TRUE, you need not supply Huffman tables at all, and any you do supply will be overwritten.
來源: <https://github.com/bither/bither-android-lib/blob/master/REASON.md>
正如libjpeg的文檔所示,我們不知道因為optimize_coding設定成了TRUE可能會花費很大的時間和空間,而optimize_coding 的預設值為FALSE。
文檔中的所有內容看起來都是沒問題的,而且libjpeg庫也是非常穩定的。但是很多人忽視了一點,這個文檔已經超過了10年。在那個時期,空間和計算能力都是非常有限的。在今天現代化的電腦甚至是手機上,這些都不是問題。相反,我們應該把更多的注意力放到圖片的品質(Reitna 屏)和圖片的大小(雲端服務)上來。
GoogleSkia項目的工程師並沒有設定這個參數,所以Skia中的optimize_coding參數是保留FALSE作為預設值,並且Skia隱藏了該設定,你無法在Sika項目的外部去改變這個設定。所以這個就變成了很大的問題,我們也不得不去忍受糟糕的畫質和更大的檔案體積。
我們的團隊已經測試了很多不同的圖片。如果你想要同樣品質的圖片壓縮,將optimize_coding設定為FALSE會比設定成TRUE的檔案體積大5到10倍。這個差距是非常大的。
我們也比較了Android和iOS之間的圖片壓縮(他們都隱藏了optimize_coding參數)。在相同的原始圖片下,如果你想獲得相同的品質層級,在Android上你需要5到10倍的檔案大小。 結論很清楚,Apple確實的知道optimize_coding和Huffman表的重要性,而Google不知道。(Apple使用它們自己的Huffman表演算法,並不是像libjpeg或者libjpeg-turbo,看起來Apple在壓縮圖片上做了更多的工作) 最後,我們決定不使用Android提供的JPEG壓縮演算法,並且我們編譯了基於libjpeg-turbo(libjpeg-turbo在表現上也有提高)的原生庫。現在我們可以節省5到10倍的空間並且享受同樣甚至更好的圖片畫質。這個工作是完全值得我們去做的。
感謝你的閱讀。
來自為知筆記(Wiz)
為什麼iPhone的圖片品質比Android的好?