Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android手機 >> Android手機知識 >> 為什麼微信android圖片質量會比iphone的差?

為什麼微信android圖片質量會比iphone的差?

編輯:Android手機知識

為什麼微信android圖片質量會比iphone的差?

我們團隊最初也糾結過這個問題,費了半天勁、繞了好大圈,直到最後才發現,原來這是谷歌犯得一個“小”錯誤,而且一直錯到了今天。

為什麼微信android圖片質量會比iphone的差?

谷歌的錯就在於:libjpeg。

libjpeg是廣泛使用的開源JPEG圖像庫(參考 http://en.wikipedia.org/wiki/Libjpeg ),安卓也依賴libjpeg來壓縮圖片。通過查看源碼,我們會發現安卓並不是直接封裝的libjpeg,而是基於了另一個叫Skia的開源項目(http://en.wikipedia.org/wiki/Skia_Graphics_Engine)來作為的圖像處理引擎。Skia是谷歌自己維護著的一個大而全的引擎,各種圖像處理功能均在其中予以實現,並且廣泛的應用於谷歌自己和其它公司的產品中(如:Chrome、Firefox、Android等)。Skia對libjpeg進行了良好的封裝,基於這個引擎可以很方便為操作系統、浏覽器等開發圖像處理功能。

libjpeg在壓縮圖像時,有一個參數叫optimize_coding,關於這個參數,libjpeg.doc有如下解釋:

為什麼微信android圖片質量會比iphone的差?

這段話大概的意思就是如果設置optimize_coding為TRUE,將會使得壓縮圖像過程中基於圖像數據計算哈弗曼表(關於圖片壓縮中的哈弗曼表,請自行查閱相關資料),由於這個計算會顯著消耗空間和時間,默認值被設置為FALSE。

這段解釋乍看起來沒有任何問題,libjpeg的代碼也經受了十多年的考驗,健壯而高效。但很多人忽略了這一點,那就是,這段解釋是十多年前寫的,對於當時的計算設備來說,空間和時間的消耗可能是顯著的,但到今天,這似乎不應再是問題,相反,我們應該更多的考慮圖片的品質(越來越好的顯示技術)和圖片的大小(越來越依賴於雲服務)。

谷歌的Skia項目工程師們最終沒有設置這個參數,optimize_coding在Skia中默認的等於了FALSE,這就意味著更差的圖片質量和更大的圖片文件,而壓縮圖片過程中所耗費的時間和空間其實反而是可以忽略不計的。那麼,這個參數的影響究竟會有多大呢?

經我們實測,使用相同的原始圖片,分別設置optimize_coding=TRUE和FALSE進行壓縮,想達到接近的圖片質量(用Photoshop放大到像素級逐塊對比),FALSE時的圖片大小大約是TRUE時的5-10倍。換句話說,如果我們想在FALSE和TRUE時壓縮成相同大小的JPEG圖片,FALSE的品質將大大遜色於TRUE的(雖然品質很難量化,但我們不妨說成是差5-10倍)。

我們又對Android和iOS進行了對比(均使用標准的JPEG壓縮方法),兩個系統都沒有提供設置optimize_coding的接口(通過閱讀源碼,我們已經知道Android是FALSE,iOS不詳),當壓縮相同的原始圖片時,結果也是一樣,iOS完勝。想要品質接近,文件大小就會差出5-10倍,而如果要壓縮出相同大小的文件,Android的壓縮品質簡直就是慘不忍睹。

結果說明,蘋果很清楚optimize_coding參數和哈弗曼表的意義,這裡需要特別指出,蘋果使用的哈弗曼表算法與libjpeg(及我們後來自行采用的libjpeg-turbo)不同,像素級可以看出區別,蘋果似乎基於libjpeg又進行了進一步的優化,壓縮出來的圖片細節上更柔和、更平滑。

以上試驗,我們嘗試過多個原圖、多種壓縮比例,試驗結果均類似,如有興趣,您不妨也自行進行嘗試。

最終我們決定,不再使用安卓系統原生的JPEG壓縮方法,而是基於libjpeg-turbo自行編譯了一版native的安卓庫,專門用來壓縮圖片,這樣在我們的產品中,就做到了僅僅用1/5的圖片大小,就能讓用戶得到不遜色甚至更優的圖片品質,對於我們團隊來說,費了半天勁、繞了好大圈是非常值得的。(使用libjpeg-turbo還有性能上的好處,這裡就不再贅述了)

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved