Android開發(fā)之圖片壓縮實現(xiàn)方法分析
本文實例講述了Android開發(fā)之圖片壓縮實現(xiàn)方法。分享給大家供大家參考,具體如下:
由于Android本身的機(jī)制限定 由于系統(tǒng)對每個應(yīng)用內(nèi)存分配規(guī)則的限制,如果加載過大圖片很有可能會導(dǎo)致OOM
即閃退或者卡屏現(xiàn)象
但是手機(jī)上拇指大小的圖片,超清是完全沒有必要的
這是我們就需要對
對片進(jìn)行壓縮處理:
大多數(shù)人采用先生成bitmap對象,反復(fù)壓縮bitmap至100k一下的方法,對圖片進(jìn)行反復(fù)壓縮,但如果是超級大圖,bitmap生成本身就已經(jīng)會導(dǎo)致OOM,所以我們應(yīng)先對bitmap進(jìn)行設(shè)置:
public static Bitmap ChangeXY(Scenic scenic, Activity activity){ BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 6; options.inPreferredConfig = Bitmap.Config.RGB_565; options.inPurgeable = true; options.inInputShareable = true; Bitmap bitmap = BitmapFactory.decodeResource(activity.getResources(),scenic.getImageId(),options); if (bitmap.getRowBytes() * bitmap.getHeight() > 1024 ){ bitmap = compressImage(bitmap); } return bitmap; }
options.inSampleSize = 6;
設(shè)置 是的原圖大小被縮小2*6=12倍
這里我解釋一下Scenic和activity:
一、senic是我自定義的一個類,其中定義了一個數(shù)據(jù)成員:imageId 用來存/drawable文件夾下,一張圖片的id。(注:不同senic對象,代表不同圖片,所以存的圖片id不同)。
二、關(guān)于activity:由于圖像處理的方法與主活動無關(guān),所以我這里將其封裝在一個特定靜態(tài)類中,但是由于執(zhí)行過程中需要使用著獲得(Activity類對象)的方法,所以將主活動作為一個參數(shù)(activity)傳入。再MainActivity中activity這樣賦值:activity=MainActivity.this
之后再采用反復(fù)壓縮bitmap來保證大小:
private static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//質(zhì)量壓縮方法,這里100表示不壓縮,把壓縮后的數(shù)據(jù)存放到baos中 int options = 100; while ( baos.toByteArray().length / 1024>100) { //循環(huán)判斷如果壓縮后圖片是否大于100kb,大于繼續(xù)壓縮 baos.reset();//重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, options, baos);//這里壓縮options%,把壓縮后的數(shù)據(jù)存放到baos中 options -= 50;//每次都減少10 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把壓縮后的數(shù)據(jù)baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream數(shù)據(jù)生成圖片 return bitmap; }
如下圖中的圖片,原大小為8.10MB:
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android圖形與圖像處理技巧總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
Android 一鍵清理、內(nèi)存清理功能實現(xiàn)
這篇文章主要介紹了Android 一鍵清理、內(nèi)存清理功能實現(xiàn),非常具有實用價值,需要的朋友可以參考下。2017-01-01詳解Android使用Gradle統(tǒng)一配置依賴管理
本篇文章主要介紹了詳解Android 使用 Gradle 統(tǒng)一配置依賴管理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01Android RadarView雷達(dá)圖(蜘蛛網(wǎng)圖)的實現(xiàn)代碼
這篇文章主要介紹了Android RadarView雷達(dá)圖(蜘蛛網(wǎng)圖)的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03android開發(fā)實現(xiàn)列表控件滾動位置精確保存和恢復(fù)的方法(推薦)
下面小編就為大家?guī)硪黄猘ndroid開發(fā)實現(xiàn)列表控件滾動位置精確保存和恢復(fù)的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03