安卓關于圖片壓縮的那些事兒,希望給每個安卓開發人員一些幫助

從事安卓開發也有幾年了,本人喜歡開門見山,此篇文章是處理以java語言下的安卓開發過程中圖片壓縮問題。

圖片加載在我們的開發過程中都是一個內存大戶,以至于我們加載每一個圖片bitmap對象的時候都應該進行回收以減少內存的占用,而如果單張圖片的大小加載在內存都會造成oom內存溢出,那么只是單純的回收就沒辦法解決了。我們就會涉及到圖片壓縮。我總結了幾種圖片壓縮的方式和圖片占內存的形式,供大家參考。 有人說一張圖片也就幾mb,而手機內存有1G-8G,為什么會內存溢出呢?這就要從圖片占用內存的形式說起了。

圖片是由像素點組成的,我們常見的分辨率1920乘1080,960乘720,2560乘1400等,其實就是指屏幕橫向或者縱向有多少個像素點,正常手機上如果圖片像素密度過大,占用的內存也就會相應的大。圖片也是一樣。以尺寸 800乘400為例,圖片占用內存就是800乘400乘每個像素點占用的字節數。那么每個像素占用多少內存呢?這就涉及到圖片像素的位圖位數。一般情況下我們只需考慮這四種模式。

ALPHA_8就是Alpha由8位組成 ARGB_4444就是由4個4位組成即16位, ARGB_8888就是由4個8位組成即32位, RGB_565就是R為5位,G為6位,B為5位共16位。 不要問我ARGB-8888為什么是三十二位,因為四八三十二。 眾所周知一個字節的存儲單位能存儲8位,所以以最占內存的ARGB-8888為 例這種模式下一個像素點會占用4個字節。也就是說,總占用內存數量為 800乘480乘4=1536000字節=1536kb=1.536mb。將ARGB-8888轉換為RGB-565, 就可以降低一半的內存消耗,但是會損失透明度,在你不需要透明度的情 況下,就可以這樣處理。這樣不會損失清晰度。這就是第一種壓縮方法。

第二種壓縮方法也是比較常見的,bitmap的自適應壓縮。也就是說,如果圖片是8000乘4000,而手機屏幕控件需要的只有800乘400,那么我就需要將圖片的長和寬壓縮到原來的1/10,這樣內存占用減少到原來的1/100,具體方法就是bitmap工廠創建bitmap對象的時候加上一個自己設置的options,并且options通過這個方法,

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height

/ (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; }

去動態計算需要壓縮的倍數,這樣就可以在視野范圍內對圖片進行無損壓縮,但是如果你要放大,就不行了。

第三種方法,這里放上一個鏈接,https://github.com/Curzibn/Luban

這是Curzibn大神寫的一個,仿照微信的一個壓縮圖片的方法,實測可以將10m左右的圖片壓縮到1m以下,不放很大看看不出損失清晰度的,具體就是寫了一個算法吧,大神的代碼我就不多解釋評價了。

第四種,也是我之前找到的一個專門用來壓縮圖片的框架,叫NativeImgCompress的一個強大的壓縮圖片框架,github上能下載,地址是https://github.com/lichao3140/NativeImgCompress1

打開jar包里面是ndk寫的 jni方法調用C語言算法的東西,總之非常強大。 最近想給我和我老婆寫一個結婚照的app記錄一下我們的一生,就用的這個壓縮方法壓縮的圖片,很強大,用法核心代碼就這一行 NativeUtil.compressBitmap(File1, File2, 50);就可以把原路徑的圖片轉存到新路徑,你的10m圖片就變成幾百k了,當然50是可以調整的。

推薦采用第三種第四種,因為不僅可以減少內存的占用,也可以減少apk安裝包的大小,瘦身還是開發者都需要的。 另外推薦一下一個原創帖子,apk瘦身圖片資源優化處理 http://blog.csdn.net/chzphoenix/article/details/75227590

寫了這么多希望對每個需要圖片處理的童鞋有所幫助,收藏一波走起吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455010.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455010.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

銀行it現狀調研_中央銀行系統行業現狀調研分析及發展趨勢預測報告(2019年版)...

QYResearch預測&#xff1a;2019-2025全球與中國中央銀行系統市場現狀及未來發展趨勢【紙版價格】&#xff1a;RMB 15000【電子版(PDF)價格】&#xff1a;RMB 15000【報告篇幅】&#xff1a;112【報告圖表數】&#xff1a;158【報告出版時間】&#xff1a;2019年11月報告摘要本…

視頻編解碼技術小結

1、什么是H.261編碼協議 答&#xff1a;H.261是最早出現的視頻編碼建議&#xff0c;它采用的算法結合了可減少時間冗余的幀間預測和可減少空間冗余的DCT變換的混合編碼方法&#xff0c;其輸出碼率是p64kbit/s。p取值較小時&#xff0c;只能傳清晰度不太高的圖像&#…

fiber報錯 (type *big.Int has no field or method FillBytes)

如何繞過dgrijalva/jwt go中的cve-2020-26160漏洞 go jwt jwt-go由于存在一個高級漏洞&#xff0c;Gitlab管道中無法傳遞容器安全狀態。此漏洞為jwt-go&#xff0c;安裝的版本為v3.2.0incompatible。錯誤標題如下&#xff1a;jwt-go: access restriction bypass vulnerability…

基于BISS0001構成的熱釋電紅外延時照明控制器電路圖

BISS0001是采用CMOS數模混合結構、具有DIP-16和SOIC-16兩種封裝的熱釋電紅外傳感信號處理集成電路。芯片內部集成了電壓比較器、狀態控制器、延時電路定時器、封鎖時間定時器以及參考電壓源等電路&#xff0c;常用于防盜報警器、自動門等各種自動開關。利用BISS0001構成的熱釋電…

安卓APP破解利器之FRIDA

本文講的是安卓APP破解利器之FRIDA&#xff0c;在我去年參加RadareCon大會的時候&#xff0c;我了解到了一個動態的二進制插樁框架——Frida。起初我覺得它似乎只有一丁點趣味&#xff0c;后來經過實踐才發現它原來是如此的有趣。記得游戲里的上帝模式嗎&#xff1f;這就是Frid…

如何獲取option的下標和值_數智化時代下,如何獲取企業增長密碼?

信息化時代下&#xff0c;很多企業前前后后上線了各種信息化系統&#xff0c;ERP、OA、CRM…隨著企業數字化的深入推進&#xff0c;“移動互聯網、云計算、大數據、人工智能、物聯網、區塊鏈”等技術的革新&#xff0c;這些信息化系統難以滿足企業對數智化轉型的新需求&#xf…

解決Gorm中使用Count后關聯查詢失效的問題

解決Gorm中使用Count后關聯查詢失效的問題 問題描述 當我們 在go中使用gorm進行多表join關聯查詢的時候 如果還有分頁的需求 那么可能會是這樣寫 package mainimport ("gorm.io/driver/mysql""gorm.io/gorm"ormLogger "gorm.io/gorm/logger"…

hdu1540/poj2892 線段數區間合并

HDU - 1540 POJ - 2892 題意&#xff1a;n個點&#xff0c;有3種操作D a表示摧毀a這個點&#xff0c;R 表示修復上一個點&#xff0c;Q x表示查詢x所在的區間沒被摧毀的連續最大區間 思路&#xff1a;線段樹區間合并&#xff0c;區間合并主要就是對lsum rsum 和sum的動態維護&…

基于51單片機的交通燈控制設計

課程設計任務書及成績 課程名稱 單片機課程設計 題目 交通燈控制設計 課程設計目標與任務、計劃與進度安排: 實踐教學要求與任務: 1、了解交通燈的基本工作原理&#xff1b; 2、用Proteus模擬實現交通燈控制&#xff1b; 3、用Keil C51編程實現上述功能&#xff1b; 4、…

福斯i6飛行模式設置_數據網絡卡的時候,不妨試試“開關飛行模式”?上網速度明顯變快...

相信大家都有過這種經歷&#xff0c;手機數據網速很慢的時候&#xff0c;開一下飛行模式再關閉&#xff0c;上網速度會比之前快很多&#xff0c;這就有人有了疑問&#xff0c;為什么呢&#xff1f;開飛行模式再關掉飛行模式&#xff0c;其實等于是完成了一次手動的小區重選。移…

安裝開源 ITIL 門戶 iTOP

在 CentOS 7 上部署iTOP是一個簡單的基于Web的開源IT服務管理工具。它有所有的ITIL功能&#xff0c;包括服務臺、配置管理、事件管理、問題管理、變更管理和服務管理。iTOP依賴于Apache/IIS、MySQL和PHP&#xff0c;因此它可以運行在任何支持這些軟件的操作系統中。因為iTOP是一…

基于FPGA 的8b10b編解碼電路前端電路設計

基于FPGA 的8b10b編解碼電路前端電路設計 摘 要 本設計是采用EDA技術設計的一種8B /10B 編解碼電路,實現了在高速的串行數據傳輸中的直流平衡。該編解碼電路設計大體上可以由五個模塊構成&#xff0c;分別是默認編碼模塊、差異度計算模塊、編碼校正模塊、并串轉換模塊、顯示模…

day15(mysql 的多表查詢,事務)

mysql之多表查詢 1.合并結果集 作用:合并結果集就是把兩個select語句查詢的結果連接到一起&#xff01; /*創建表t1*/ CREATE TABLE t1(a INT PRIMARY KEY ,b VARCHAR(10) ) INSERT INTO t1 VALUES(1,a); INSERT INTO t1 VALUES(2,b); INSERT INTO t1 VALUES(3,c); /*創建t2*/…

vue router傳參_新手使用vue-router傳參時注意事項

1. 使用name和params組合傳參this.$router.push({name: details, params: {id: 233}})路由配置import Vue from vueimport Router from vue-router Vue.use(Router) export default new Router({ mode: history, routes: [ { path: /details, name: details, component: resolv…

FFMpeg分析詳細分析

與其說是分析&#xff0c;不如說是學習&#xff0c;只是看在自己第一次寫系列文章的份上&#xff0c;給足自己面子&#xff0c;取個有"深度"的題目&#xff01;如有人被題目所蒙騙進來&#xff0c;還望見諒&#xff01; URLProtocol,URLContext和ByteIOContext是FFMp…

《jQuery基礎》總結

目前&#xff0c;互聯網上最好的jQuery入門教材&#xff0c;是Rebecca Murphey寫的《jQuery基礎》&#xff08;jQuery Fundamentals&#xff09;。這本書雖然是入門教材&#xff0c;但也足足有100多頁。我對它做了一個詳細的筆記&#xff0c;試圖理清jQuery的設計思想&#xff…

邏輯綜合工具DesignCompiler使用教程

邏輯綜合工具Design Compiler使用教程 圖形界面design vision操作示例 邏輯綜合主要是將HDL語言描述的電路轉換為工藝庫器件構成的網表的過程。綜合工具目前比較主流的是synopsys公司Design Compiler&#xff0c;我們在設計實踐過程中采用這一工具。Design compiler有兩種工作…

遍歷結構體_三菱ST語言編程(3)——結構體變量

上篇文章介紹了數組&#xff0c;是一組相同類型數據的列表&#xff0c;那么不同類型的數據能否組合到一起用一個標簽表示呢&#xff1f;答案當然是可以的&#xff0c;而實現這個功能的就是結構體(struct)。建立結構體在三菱結構化編程的界面中左側程序部件里可以找到結構體標簽…

關于微信小程序swiper的問題

關于小程序swiper的問題 代碼 在官方示例上給swiper添加了currentbindchangecircular添加了一個buttonbindtap用于切換下一張 index.wxml <swiper indicator-dots"{{indicatorDots}}"bindchange"swiperChange"current"{{index}}"circular&quo…

PyQt5案例匯總(完整版)

個人博客點這里 PyQt5案例匯總(完整版) 起步 PyQt5是一套綁定Qt5的應用程序框架。他在Python 2.x和3.x中都是可用的。該教程使用的是Python3.x。 Qt庫是一套最有用的GUI庫。 PyQt5是作為一套Python模塊實現的。他已經超過620個類和6000個函數與方法。他是一個運行在所有主…