android 图片压缩的几种方法
16lz
2021-01-23
项目中用到上传图片,但是手机拍出来的图片都比较大,需要进行压缩,所以找了下图片压缩的方法,看到这篇博文还不错。记录下:
原文地址:http://104zz.iteye.com/blog/1694762
第一:我们先看下质量压缩方法:
Java代码
- privateBitmapcompressImage(Bitmapimage){
- ByteArrayOutputStreambaos=newByteArrayOutputStream();
- image.compress(Bitmap.CompressFormat.JPEG,100,baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
- intoptions=100;
- while(baos.toByteArray().length/1024>100){//循环判断如果压缩后图片是否大于100kb,大于继续压缩
- baos.reset();//重置baos即清空baos
- image.compress(Bitmap.CompressFormat.JPEG,options,baos);//这里压缩options%,把压缩后的数据存放到baos中
- options-=10;//每次都减少10
- }
- ByteArrayInputStreamisBm=newByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
- Bitmapbitmap=BitmapFactory.decodeStream(isBm,null,null);//把ByteArrayInputStream数据生成图片
- returnbitmap;
- }
第二:图片按比例大小压缩方法(根据路径获取图片并压缩):
Java代码
- privateBitmapgetimage(StringsrcPath){
- BitmapFactory.OptionsnewOpts=newBitmapFactory.Options();
- //开始读入图片,此时把options.inJustDecodeBounds设回true了
- newOpts.inJustDecodeBounds=true;
- Bitmapbitmap=BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空
- newOpts.inJustDecodeBounds=false;
- intw=newOpts.outWidth;
- inth=newOpts.outHeight;
- //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
- floathh=800f;//这里设置高度为800f
- floatww=480f;//这里设置宽度为480f
- //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
- intbe=1;//be=1表示不缩放
- if(w>h&&w>ww){//如果宽度大的话根据宽度固定大小缩放
- be=(int)(newOpts.outWidth/ww);
- }elseif(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);
- returncompressImage(bitmap);//压缩好比例大小后再进行质量压缩
- }
第三:图片按比例大小压缩方法(根据Bitmap图片压缩):
Java代码
- privateBitmapcomp(Bitmapimage){
- ByteArrayOutputStreambaos=newByteArrayOutputStream();
- image.compress(Bitmap.CompressFormat.JPEG,100,baos);
- if(baos.toByteArray().length/1024>1024){//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
- baos.reset();//重置baos即清空baos
- image.compress(Bitmap.CompressFormat.JPEG,50,baos);//这里压缩50%,把压缩后的数据存放到baos中
- }
- ByteArrayInputStreamisBm=newByteArrayInputStream(baos.toByteArray());
- BitmapFactory.OptionsnewOpts=newBitmapFactory.Options();
- //开始读入图片,此时把options.inJustDecodeBounds设回true了
- newOpts.inJustDecodeBounds=true;
- Bitmapbitmap=BitmapFactory.decodeStream(isBm,null,newOpts);
- newOpts.inJustDecodeBounds=false;
- intw=newOpts.outWidth;
- inth=newOpts.outHeight;
- //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
- floathh=800f;//这里设置高度为800f
- floatww=480f;//这里设置宽度为480f
- //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
- intbe=1;//be=1表示不缩放
- if(w>h&&w>ww){//如果宽度大的话根据宽度固定大小缩放
- be=(int)(newOpts.outWidth/ww);
- }elseif(w<h&&h>hh){//如果高度高的话根据宽度固定大小缩放
- be=(int)(newOpts.outHeight/hh);
- }
- if(be<=0)
- be=1;
- newOpts.inSampleSize=be;//设置缩放比例
- //重新读入图片,注意此时已经把options.inJustDecodeBounds设回false了
- isBm=newByteArrayInputStream(baos.toByteArray());
- bitmap=BitmapFactory.decodeStream(isBm,null,newOpts);
- returncompressImage(bitmap);//压缩好比例大小后再进行质量压缩
- }
更多相关文章
- 2011.10.14——— android 仿照微信的图片展示功能 之 基本功能
- 流媒体开发之-服务器图片的加载
- Android开发教程--设置ImageView图片的显示比例
- 麦子学院android老师分享android实现listview异步加载图片的方法
- Android Glide加载图片,宽度占满屏幕高度自适应
- Android 控件ImageView图片框
- android异步加载图片显示,并且对图片进行缓存实例
- Android显示网络图片实例