首页 > 学院 > 开发设计 > 正文

图片的压缩处理

2019-11-09 18:20:29
字体:
来源:转载
供稿:网友

在处理图片显示时,如果图片显示较少,一般没有什么问题。但如果一次加载很多图片,很有可能报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即清空baosoptions -= 10;//每次都减少10image.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表示压缩一半。

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

 

 

 

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表