android下图片压缩 -- 图像处理
16lz
2021-01-23
第一:我们先看下质量压缩方法:
[java] view plain copy
- 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] view plain copy
- 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] view plain copy
- 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);//压缩好比例大小后再进行质量压缩
- }
更多相关文章
- android帧动画(图片切换)——语音播放小喇叭
- Android前端开发15:显示网络图片
- Android Retrofit 图片上传的最简单和明白的实现方式
- Android设置桌面背景图片的方法
- android 获取屏幕的宽度和高度
- Android从服务器获取图片的实例方法