Android开发图片的压缩处理

释放双眼,带上耳机,听听看~!

在处理图片显示时,如果图片显示较少,一般没有什么问题。但如果一次加载很多图片,很有可能报oom错误。比如照片墙,viewpager同时显示几十张图片,所有有必要了解图片的压缩处理。

1.新建一个函数,封装图片的压缩处理。

private Bitmap decodeBitmapFromFile(String absolutePath, int reqWidth, int reqHeight) { 参数分别是:图片的绝对路径,图片设置的宽度,图片设置的高度

 Bitmap bm = null;      // First decode with inJustDecodeBounds=true to check dimensions  

 final BitmapFactory.Options options = new BitmapFactory.Options();  

options. inJustDecodeBounds = true ;  

 BitmapFactory. decodeFile(absolutePath, options);      // Calculate inSampleSize  

 options. inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);      // Decode bitmap with inSampleSize set

options. inJustDecodeBounds = false ;  

bm = BitmapFactory. decodeFile(absolutePath, options);    

  return bm; }   

 

当把options. inJustDecodeBounds 设置为true时,BitmapFactory. decodeFile(absolutePath, options并不生成bitmap,而是获取了图片的宽度和高度,然后设置options. inSampleSize设置缩放比例,让后就可以得到压缩大小的图片。

private int calculateInSampleSize(Options options, int reqWidth,     int reqHeight) {   // Raw height and width of image  

 final int height = options.outHeight;  

 final int width = options.outWidth;  

int inSampleSize = 1;      

 if (height > reqHeight || width > reqWidth) {  

 if (width > height) {  

inSampleSize = Math. round((float)height / ( float)reqHeight);  

 } else {  

 inSampleSize = Math. round((float)width / ( float)reqWidth);  

 }  

}     

return inSampleSize;

}

 

这里的图片压缩只是压缩了图片的大小,如果需要压缩图片的质量,可以用新的函数。

private Bitmap compressImage(Bitmap image) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int options = 100;
while ( baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset();//重置baos即清空baos
options -= 10;//每次都减少10
image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中

}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
return bitmap;
}

 

主要是通过image.compress(Bitmap.CompressFormat.JPEG, 100, baos);来压缩图片的质量,其中100表示不压缩,50表示压缩一半。

图片压缩就是这些了,其实比较简单。

人已赞赏
Android文章

Android开发translate动画

2020-3-13 17:27:22

Android文章

android简单服务器的搭建

2020-3-13 17:28:46

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索