android圖的壓縮分三種
1.質(zhì)量壓縮
2.比例壓縮
3.減少像素占的位數(shù)壓縮圖片
質(zhì)量壓縮
質(zhì)量壓縮就是對圖片文件的大小進(jìn)行壓縮蜓氨,而圖片轉(zhuǎn)化為bitmap占用的內(nèi)存并不會改變。
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;
}
通過上面的代碼可以看出圖片占用的運行內(nèi)存并沒改變。但是stream卻變小了。
比例壓縮
比例壓縮改變圖片的分辨率裕坊,減少圖的像素點。犧牲圖片了圖片的清晰度燕酷。
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)存大小,會發(fā)現(xiàn)占用內(nèi)存變小了
減少像素占的位數(shù)壓縮圖片
Bitmap.Config ARGB_4444:由4個4位組成苗缩,即A=4饵蒂,R=4,G=4酱讶,B=4退盯,那么一個像素點占4+4+4+4=16位
Bitmap.Config ARGB_8888:由4個8位組成,即A=8泻肯,R=8渊迁,G=8,B=8灶挟,那么一個像素點占8+8+8+8=32位
Bitmap.Config RGB_565:即R=5琉朽,G=6,B=5稚铣,沒有透明度漓骚,那么一個像素點占5+6+5=16位
Bitmap.Config ALPHA_8:只有透明度,沒有顏色榛泛,那么一個像素點占8位蝌蹂。
所以
ALPHA_8代表8位Alpha位圖
ARGB_4444代表16位ARGB位圖
ARGB_8888代表32位ARGB位圖
RGB_565代表16位RGB位圖
位圖位數(shù)越高代表其可以存儲的顏色信息越多,圖像也就越逼真
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;
}