在处理图片显示时,如果图片显示较少,一般没有什么问题。但如果一次加载很多图片,很有可能报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表示压缩一半。
图片压缩就是这些了,其实比较简单。
新闻热点
疑难解答