安卓圖片反復(fù)壓縮后為什么普遍會(huì)變綠而不是其它顏色?
業(yè)余版概要:
安卓的一個(gè)核心的部分的代碼,為了優(yōu)化執(zhí)行速度進(jìn)行了魔改,結(jié)果寫錯(cuò)了代碼。結(jié)果導(dǎo)致 JPG 圖片壓縮發(fā)綠、崩壞。與安卓上的應(yīng)用無關(guān),它們是受害者
專業(yè)版概要:
問題出在 Android 提供的壓縮圖片接口上,準(zhǔn)確的說是一個(gè) Android 里一個(gè)叫做 Skia 的庫上。而這個(gè) bug 在 2016 年 4 月中旬被修復(fù)了,如果按照 Android 的發(fā)行來看,那就是從 Android 7 (Nougat) 開始才消除這個(gè)問題。
問題出在 RGB 色彩空間轉(zhuǎn)換到 YUV 的時(shí)候。但問題不僅僅是精度下降,最大的問題是,錯(cuò)誤的舍入(向下取整)。
現(xiàn)在就要說到 Android 系統(tǒng)到底為什么出了這個(gè)問題了。Android 系統(tǒng)自起誕生以來就引入了名為 Skia 的圖像庫(Google 自家產(chǎn)品),用于處理圖像,其中包括把圖片壓縮成 JPEG(平時(shí)說的 JPG)。而 Skia 又是調(diào)用libjpeg-turbo 來實(shí)現(xiàn)真正的壓縮過程的。為了達(dá)到更好的壓縮效果,JPEG 算法本身,將通常屏幕上表示顏色的 RGB(紅綠藍(lán))數(shù)值,轉(zhuǎn)換為 YUV 數(shù)值(亮度,藍(lán)色分量,紅色分量)。正常情況下這個(gè)算法是輕微有損的。
但是 Skia 不走尋常路,在將這個(gè)變換算法的各個(gè)常數(shù)復(fù)制到自己的代碼里的時(shí)候(當(dāng)然是合法地),降低了精度,以達(dá)到更高的速度(專業(yè)準(zhǔn)確地說,從 16 位定點(diǎn)數(shù),降低到了 8 位定點(diǎn)數(shù)),這導(dǎo)致了更大的損傷。
最可怕的是……在進(jìn)行這個(gè)變換運(yùn)算的最后一步,需要除以 256,而代碼中,采用了右移操作代替除法以提高執(zhí)行速度。
假如我們是 Skia 開發(fā)者,如何修復(fù)這個(gè)問題?
交回給 libjpeg-turbo 庫自己來做色彩空間變換,把原本 Skia 庫 YUV 轉(zhuǎn)換代碼全部刪掉了,把這個(gè)過程留給整個(gè)過程最底層的 libjpeg-turbo庫自己來做,并且用默認(rèn)的 JDCT_ISLOW 方法代替JDCT_IFAST 方法。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- php高清晰度無損圖片壓縮功能的實(shí)現(xiàn)代碼
- Android小知識(shí)之圖片的3種壓縮方式小結(jié)
- 移動(dòng)端圖片上傳旋轉(zhuǎn)、壓縮問題的方法
- 微信小程序中上傳圖片并進(jìn)行壓縮的實(shí)現(xiàn)代碼
- php實(shí)現(xiàn)等比例壓縮圖片
- Java實(shí)現(xiàn)的上傳并壓縮圖片功能【可等比例壓縮或原尺寸壓縮】
- 微信小程序之批量上傳并壓縮圖片的實(shí)例代碼
- java多線程實(shí)現(xiàn)下載圖片并壓縮
- PHP實(shí)現(xiàn)壓縮圖片尺寸并轉(zhuǎn)為jpg格式的方法示例
- Android LuBan與Compressor圖片壓縮方式
相關(guān)文章
Android開發(fā)Kotlin語言協(xié)程中的并發(fā)問題和互斥鎖
Android開發(fā)Kotlin語言提供了多種機(jī)制來處理并發(fā)和同步,其中包括高層次和低層次的工具,對(duì)于常規(guī)的并發(fā)任務(wù),可以利用 Kotlin 協(xié)程提供的結(jié)構(gòu)化并發(fā)方式,而對(duì)于需要更低層次的鎖定機(jī)制,可以使用Mutex(互斥鎖)來實(shí)現(xiàn)對(duì)共享資源的線程安全訪問2024-06-06Android實(shí)現(xiàn)手機(jī)監(jiān)控?cái)z像頭
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)手機(jī)監(jiān)控?cái)z像頭,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Android?完整購物商城界面的實(shí)現(xiàn)案例
這篇文章為大家?guī)硪粋€(gè)Android?完整購物商城的界面具體的實(shí)現(xiàn),案例中含有商品列表的顯示,為商城最重要的功能之一,感興趣的朋友來看看吧2022-03-03Android學(xué)習(xí)小結(jié)之獲取被啟動(dòng)的Activity傳回的數(shù)據(jù)
這篇文章主要介紹了獲取被啟動(dòng)的Activity傳回的數(shù)據(jù),非常不錯(cuò),介紹的非常詳細(xì),需要的朋友可以參考下2016-08-08Android控件ViewFlipper仿淘寶頭條垂直滾動(dòng)廣告條
這篇文章主要為大家詳細(xì)介紹了Android控件ViewFlipper仿淘寶頭條垂直滾動(dòng)廣告條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05android FM播放時(shí)拔出耳機(jī)后FM APP自動(dòng)close解決方法
android FM播放時(shí)拔出耳機(jī)后FM APP自動(dòng)close關(guān)閉的情況應(yīng)該怎樣解決呢?下面為大家詳細(xì)介紹下具體修改方法,感興趣的朋友可以參考下2013-06-06解析Android中Animation動(dòng)畫的編寫要點(diǎn)
這篇文章主要介紹了Android中Animation動(dòng)畫的編寫要點(diǎn),講解了Animation的幾個(gè)常用標(biāo)簽的用法,需要的朋友可以參考下2016-04-04