編輯:Android手機知識
我們團隊最初也糾結過這個問題,費了半天勁、繞了好大圈,直到最後才發現,原來這是谷歌犯得一個“小”錯誤,而且一直錯到了今天。
谷歌的錯就在於: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有如下解釋:
這段話大概的意思就是如果設置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還有性能上的好處,這裡就不再贅述了)
通常情況下用戶每天都會為自己的手機充電,不過偶爾也會出現來不及為手機充電的情況。那麼怎樣才能在短時間內將手機的電量充滿呢?下面小編就為大家介紹一下,下面一起來看看吧!外媒
現在不管是公共的WIFI熱點,如CMCC或者自家買的無線路由組建的WIFI都己經很普遍了,而且百分80的人手機都在用WIFI無線功能上網,那麼手機上在連接上無線網後怎麼查
[摘要]本文我們電話暗訪了廠商客服,並通過拆解的方式為您展示真假數據線的區別。下面就一起來看看吧,希望可以對大家有所幫助的手機玩久了,經常輔助使用的各種配件在所難免就會破
聯想A2580獲取root權限的詳細步驟。作為近期聯想首推Android5.0低端機型之一的聯想A2580,剛上市己經有不少的用戶在使用它了。使用時你會發現系