Android图片质量压缩_安卓图片大小无损压缩算法
2015-07-23 12:40:42  By: dwtedx

最近做一个项目、需要使用到上传图片、从相册中选或者用相机拍照、那么不管是采用那种方式、图片数据都会很大、那么这个时候一定会涉及到图片的压缩、经过查阅网络、找到了三种方法压缩图片


压缩方式一、我们先看下质量压缩方法

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


压缩方式二、图片按比例大小压缩方法(根据路径获取图片并压缩)

private Bitmap getimage(String srcPath) {  
	BitmapFactory.Options newOpts = new BitmapFactory.Options();  
	//开始读入图片,此时把options.inJustDecodeBounds 设回true了  
	newOpts.inJustDecodeBounds = true;
	//此时返回bm为空  
	Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);
	  
	newOpts.inJustDecodeBounds = false;  
	int w = newOpts.outWidth;  
	int h = newOpts.outHeight;  
	//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  
	float hh = 800f;//这里设置高度为800f  
	float ww = 480f;//这里设置宽度为480f  
	//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
	int be = 1;//be=1表示不缩放  
	if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放  
		be = (int) (newOpts.outWidth / ww);  
	} else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
		be = (int) (newOpts.outHeight / hh);  
	}  
	if (be <= 0)  
		be = 1;  
	newOpts.inSampleSize = be;//设置缩放比例  
	//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
	bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
	return compressImage(bitmap);//压缩好比例大小后再进行质量压缩  
}


压缩方式三、图片按比例大小压缩方法(根据Bitmap图片压缩)

private Bitmap comp(Bitmap image) {  
      
	ByteArrayOutputStream baos = new ByteArrayOutputStream();         
	image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
	//判断如果图片大于1M,进行压缩避免在生成图片
	//(BitmapFactory.decodeStream)时溢出
	if( baos.toByteArray().length / 1024>1024) {
		baos.reset();//重置baos即清空baos
		//这里压缩50%,把压缩后的数据存放到baos中  
		image.compress(Bitmap.CompressFormat.JPEG, 50, baos);
	}  
	ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  
	BitmapFactory.Options newOpts = new BitmapFactory.Options();  
	//开始读入图片,此时把options.inJustDecodeBounds 设回true了  
	newOpts.inJustDecodeBounds = true;  
	Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
	newOpts.inJustDecodeBounds = false;  
	int w = newOpts.outWidth;  
	int h = newOpts.outHeight;  
	//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  
	float hh = 800f;//这里设置高度为800f  
	float ww = 480f;//这里设置宽度为480f  
	//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  
	int be = 1;//be=1表示不缩放  
	if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放  
		be = (int) (newOpts.outWidth / ww);  
	} else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放  
		be = (int) (newOpts.outHeight / hh);  
	}  
	if (be <= 0)  
		be = 1;  
	newOpts.inSampleSize = be;//设置缩放比例  
	//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  
	isBm = new ByteArrayInputStream(baos.toByteArray());  
	bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
	return compressImage(bitmap);//压缩好比例大小后再进行质量压缩  
}  


以前三个方法都可以实现图片的压缩功能、看个人需要、可以自由选择

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


快速评论


技术评论

DD记账
top
+