溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android圖片資源瘦身的方法是什么

發(fā)布時間:2022-01-12 14:48:27 來源:億速云 閱讀:102 作者:iii 欄目:云計算

這篇文章主要介紹“Android圖片資源瘦身的方法是什么”,在日常操作中,相信很多人在Android圖片資源瘦身的方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Android圖片資源瘦身的方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一.選擇壓縮工具

首先是選擇壓縮工具的問題,在這之前先看下系統(tǒng)是如何做的。android的aapt在編譯階段其實是會對png圖片進行壓縮的,用的則是libpng和zlib,這個可以用aapt的源碼佐證:

  • 用libpng對圖片進行預處理

  • 用zlib對預處理后的圖片進行壓縮生成新圖片

可以看到aapt對圖片的壓縮等級使用了最高等級9,期間系統(tǒng)也會做顏色表轉換,這樣可以減少很大一部分圖片的體積,但系統(tǒng)的壓縮方案是不是完美無缺呢?目前常用的無損壓縮大概有Pngrewrite、pngcrush、optipng、advancecom、pngout,參考了很多文章,得出的結果是pngout仍然是王者,畢竟是Ken神童(據(jù)說Doom and Quake的作者John都尊敬他,做游戲的肯定都知道John )寫的。另外由于pngout可以很好的支持命令行,方便放到編譯腳本中自動化,所以暫時選它好了。

二.實踐案例

壓縮工具選好了,第二步便是實驗了。拿手Q為例,直接對手Q中的所有png壓一遍,Pngout的速度確實一般,對4千張圖片全部處理一遍大概需要13分鐘,不過這個過程只需要在本地做一遍,所以可以忍受,但處理完的結果不理想,因為沒什么效果,減小量為十幾KB~~ 仔細分析得知這里面犯渾作怪的竟然是aapt,由于先調pngout再調aapt會導致壓縮效果覆蓋。那么可不可以關閉aapt呢? 查看aapt的參數(shù),關于壓縮相關的只有下面這兩個參數(shù):

其中crunch便是預處理資源了,但是沒有關閉crunch的參數(shù)。。。。有點技窮了對不對。只能去源碼中找靈感了,看aapt的源碼:

google把它隱藏了,沒有打印出來給用戶~打開這個參數(shù),在手Q中資源打包腳本處分別加入--no-crunch參數(shù),便可以把系統(tǒng)壓縮給屏蔽掉了,樣式如下:

至于為什么設置了這個參數(shù)就可以屏蔽呢,其實源碼調用過程如下:

第1步 (Main.cpp)

第2步 (Command.cpp)

第3步 (Resource.cpp)

終結: (Resource.cpp)

可是實驗還沒有結束,因為這樣屏蔽掉會出現(xiàn)奇葩的景象,得到的手Q畫面效果如下:

為什么呢?仔細分析發(fā)現(xiàn)九宮格圖片被壓出問題了,aapt在處理png圖片時會判斷是不是九宮格圖片,如果是則做特殊預處理:

do_9patch其實主要的是九宮格信息弄出來,寫入到info9Patch字段,并最終寫入nptc的chunk中:

到這里又回到第一步為什么我說Ken是神童了,因為Pngout可以選擇chunk進行壓縮,所以解決方案便是:對于九宮格圖片,我們單獨拎出來,先用aapt的aapt crunch進行預處理得到npTc字段,再用pngout在壓縮時調用"knptc"參數(shù)保護一下npTc塊,這樣便得到了正確的九宮格圖片,安裝包的效果圖也就正常了。

到此,關于“Android圖片資源瘦身的方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI