Android 圖片壓縮

android圖的壓縮分三種

1.質(zhì)量壓縮

2.比例壓縮

3.減少像素占的位數(shù)壓縮圖片

質(zhì)量壓縮

質(zhì)量壓縮就是對(duì)圖片文件的大小進(jìn)行壓縮,而圖片轉(zhuǎn)化為bitmap占用的內(nèi)存并不會(huì)改變。


public staticBitmapcompressBitmap(Bitmap bitmap) {

Log.e("size",bitmap.getByteCount()/1024+"kb");

ByteArrayOutputStream stream =newByteArrayOutputStream();

bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);//質(zhì)量壓縮方法,100代表不壓縮,數(shù)據(jù)傳到stream

intoptions =90;

while(stream.toByteArray().length/1024>2048) {//如果圖片大于2048kb繼續(xù)壓縮

stream.reset();//清空輸出流中的數(shù)據(jù)

bitmap.compress(Bitmap.CompressFormat.JPEG,options,stream);

options -=10;

}

Log.e("size",stream.toByteArray().length/1024+"kb");

ByteArrayInputStream inputStream =newByteArrayInputStream(stream.toByteArray());

Bitmap compressBitmap= BitmapFactory.decodeStream(inputStream, null, null);

Log.e("size",compressBitmap.getByteCount()/1024+"kb");

returncompressBitmap;

}

通過上面的代碼可以看出圖片占用的運(yùn)行內(nèi)存并沒改變。但是stream卻變小了。

比例壓縮

比例壓縮改變圖片的分辨率,減少圖的像素點(diǎn)。犧牲圖片了圖片的清晰度。


public staticBitmapgetBitmap(String srcPath) {

BitmapFactory.Options options =newBitmapFactory.Options();

options.inJustDecodeBounds=true;//不給bitmap分配內(nèi)存,但圖片寬高信息存在了options中

Bitmap bitmap = BitmapFactory.decodeFile(srcPath,options);

intw = options.outWidth;

inth = options.outHeight;

floathh =800f;

floatww =480f;

intbe =1;// be=1表示不縮放

if(w > h && w > ww) {//如果寬度大的話根據(jù)寬度固定大小縮放

be = (int) (options.outWidth/ ww);

}else if(w < h && h > hh) {//如果高度高的話根據(jù)寬度固定大小縮放

be = (int) (options.outHeight/ hh);

}

if(be <=0) {

be =1;

}

options.inSampleSize= be;//設(shè)置縮放比例

options.inJustDecodeBounds=false;

bitmap = BitmapFactory.decodeFile(srcPath,options);

return bitmap;

}```

打印查看bitmap占用的內(nèi)存大小,會(huì)發(fā)現(xiàn)占用內(nèi)存變小了

減少像素占的位數(shù)壓縮圖片

Bitmap.Config ARGB_4444:由4個(gè)4位組成,即A=4,R=4,G=4,B=4,那么一個(gè)像素點(diǎn)占4+4+4+4=16位

Bitmap.Config ARGB_8888:由4個(gè)8位組成,即A=8,R=8,G=8,B=8,那么一個(gè)像素點(diǎn)占8+8+8+8=32位

Bitmap.Config RGB_565:即R=5,G=6,B=5,沒有透明度,那么一個(gè)像素點(diǎn)占5+6+5=16位

Bitmap.Config ALPHA_8:只有透明度,沒有顏色,那么一個(gè)像素點(diǎn)占8位。

所以

ALPHA_8代表8位Alpha位圖

ARGB_4444代表16位ARGB位圖

ARGB_8888代表32位ARGB位圖

RGB_565代表16位RGB位圖

位圖位數(shù)越高代表其可以存儲(chǔ)的顏色信息越多,圖像也就越逼真

private static final intRGB_565=0x01;

private static final intALPHA_8=0x02;

private static final intARGB_4444=0x03;

public staticBitmapgitImage(String path, inttype) {

BitmapFactory.Options options =newBitmapFactory.Options();

switch(type) {

caseRGB_565:

options.inPreferredConfig= Bitmap.Config.RGB_565;

break;

caseALPHA_8:

options.inPreferredConfig= Bitmap.Config.ALPHA_8;

break;

caseARGB_4444:

options.inPreferredConfig= Bitmap.Config.ARGB_4444;

break;

default:

options.inPreferredConfig= Bitmap.Config.ARGB_8888;

break;

}

Bitmap bitmap = BitmapFactory.decodeFile(path,options);

ByteArrayOutputStream stream =newByteArrayOutputStream();

bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);

Log.d("size",stream.toByteArray().length/1024+"kb");

returnbitmap;

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容