Android開發(fā)之圖片壓縮實(shí)現(xiàn)方法分析
本文實(shí)例講述了Android開發(fā)之圖片壓縮實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
由于Android本身的機(jī)制限定 由于系統(tǒng)對(duì)每個(gè)應(yīng)用內(nèi)存分配規(guī)則的限制,如果加載過(guò)大圖片很有可能會(huì)導(dǎo)致OOM
即閃退或者卡屏現(xiàn)象
但是手機(jī)上拇指大小的圖片,超清是完全沒(méi)有必要的
這是我們就需要對(duì)
對(duì)片進(jìn)行壓縮處理:
大多數(shù)人采用先生成bitmap對(duì)象,反復(fù)壓縮bitmap至100k一下的方法,對(duì)圖片進(jìn)行反復(fù)壓縮,但如果是超級(jí)大圖,bitmap生成本身就已經(jīng)會(huì)導(dǎo)致OOM,所以我們應(yīng)先對(duì)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是我自定義的一個(gè)類,其中定義了一個(gè)數(shù)據(jù)成員:imageId 用來(lái)存/drawable文件夾下,一張圖片的id。(注:不同senic對(duì)象,代表不同圖片,所以存的圖片id不同)。
二、關(guān)于activity:由于圖像處理的方法與主活動(dòng)無(wú)關(guān),所以我這里將其封裝在一個(gè)特定靜態(tài)類中,但是由于執(zhí)行過(guò)程中需要使用著獲得(Activity類對(duì)象)的方法,所以將主活動(dòng)作為一個(gè)參數(shù)(activity)傳入。再M(fèi)ainActivity中activity這樣賦值:activity=MainActivity.this
之后再采用反復(fù)壓縮bitmap來(lái)保證大?。?/p>
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)試技巧與常見問(wèn)題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
設(shè)置界面開發(fā)Preference Library數(shù)據(jù)重建機(jī)制詳解
這篇文章主要為大家介紹了設(shè)置界面開發(fā)利器Preference Library數(shù)據(jù)重建機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Android Activity的4種啟動(dòng)模式圖文介紹
這篇文章主要給大家介紹了關(guān)于Android Activity的4種啟動(dòng)模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Android實(shí)現(xiàn)手機(jī)震動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)手機(jī)震動(dòng)效果的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02
Android開發(fā)實(shí)現(xiàn)高仿優(yōu)酷的客戶端圖片左右滑動(dòng)切換功能實(shí)例【附源碼下載】
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)高仿優(yōu)酷的客戶端圖片左右滑動(dòng)切換功能,結(jié)合實(shí)例形式分析了Android基于ViewPager實(shí)現(xiàn)圖片切換效果的相關(guān)操作技巧,并附帶完整工程源碼供讀者下載參考,需要的朋友可以參考下2017-11-11
Android利用Gson解析嵌套多層的Json的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇Android利用Gson解析嵌套多層的Json的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08

