您好,登錄后才能下訂單哦!
這篇文章主要介紹“Android圖片資源瘦身的方法是什么”,在日常操作中,相信很多人在Android圖片資源瘦身的方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Android圖片資源瘦身的方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
首先是選擇壓縮工具的問題,在這之前先看下系統是如何做的。android的aapt在編譯階段其實是會對png圖片進行壓縮的,用的則是libpng和zlib,這個可以用aapt的源碼佐證:
用libpng對圖片進行預處理
用zlib對預處理后的圖片進行壓縮生成新圖片
可以看到aapt對圖片的壓縮等級使用了最高等級9,期間系統也會做顏色表轉換,這樣可以減少很大一部分圖片的體積,但系統的壓縮方案是不是完美無缺呢?目前常用的無損壓縮大概有Pngrewrite、pngcrush、optipng、advancecom、pngout,參考了很多文章,得出的結果是pngout仍然是王者,畢竟是Ken神童(據說Doom and Quake的作者John都尊敬他,做游戲的肯定都知道John )寫的。另外由于pngout可以很好的支持命令行,方便放到編譯腳本中自動化,所以暫時選它好了。
壓縮工具選好了,第二步便是實驗了。拿手Q為例,直接對手Q中的所有png壓一遍,Pngout的速度確實一般,對4千張圖片全部處理一遍大概需要13分鐘,不過這個過程只需要在本地做一遍,所以可以忍受,但處理完的結果不理想,因為沒什么效果,減小量為十幾KB~~ 仔細分析得知這里面犯渾作怪的竟然是aapt,由于先調pngout再調aapt會導致壓縮效果覆蓋。那么可不可以關閉aapt呢? 查看aapt的參數,關于壓縮相關的只有下面這兩個參數:
其中crunch便是預處理資源了,但是沒有關閉crunch的參數。。。。有點技窮了對不對。只能去源碼中找靈感了,看aapt的源碼:
google把它隱藏了,沒有打印出來給用戶~打開這個參數,在手Q中資源打包腳本處分別加入--no-crunch
參數,便可以把系統壓縮給屏蔽掉了,樣式如下:
至于為什么設置了這個參數就可以屏蔽呢,其實源碼調用過程如下:
第1步 (Main.cpp)
第2步 (Command.cpp)
第3步 (Resource.cpp)
終結: (Resource.cpp)
可是實驗還沒有結束,因為這樣屏蔽掉會出現奇葩的景象,得到的手Q畫面效果如下:
為什么呢?仔細分析發現九宮格圖片被壓出問題了,aapt在處理png圖片時會判斷是不是九宮格圖片,如果是則做特殊預處理:
do_9patch其實主要的是九宮格信息弄出來,寫入到info9Patch字段,并最終寫入nptc的chunk中:
到這里又回到第一步為什么我說Ken是神童了,因為Pngout可以選擇chunk進行壓縮,所以解決方案便是:對于九宮格圖片,我們單獨拎出來,先用aapt的aapt crunch進行預處理得到npTc字段,再用pngout在壓縮時調用"knptc"參數保護一下npTc塊,這樣便得到了正確的九宮格圖片,安裝包的效果圖也就正常了。
到此,關于“Android圖片資源瘦身的方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。