欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

Android图片质量压缩_安卓图片大小无损压缩算法

程序员文章站 2022-03-01 13:23:32
...

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


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

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);//压缩好比例大小后再进行质量压缩  
}  


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