`
810364804
  • 浏览: 783177 次
文章分类
社区版块
存档分类
最新评论

android 比较靠谱的图片压缩

 
阅读更多


项目中用到上传图片,但是手机拍出来的图片都比较大,需要进行压缩,所以找了下图片压缩的方法,看到这篇博文还不错。记录下:


原文地址:http://104zz.iteye.com/blog/1694762

第一:我们先看下质量压缩方法:

Java代码收藏代码
  1. privateBitmapcompressImage(Bitmapimage){
  2. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  3. image.compress(Bitmap.CompressFormat.JPEG,100,baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
  4. intoptions=100;
  5. while(baos.toByteArray().length/1024>100){//循环判断如果压缩后图片是否大于100kb,大于继续压缩
  6. baos.reset();//重置baos即清空baos
  7. image.compress(Bitmap.CompressFormat.JPEG,options,baos);//这里压缩options%,把压缩后的数据存放到baos中
  8. options-=10;//每次都减少10
  9. }
  10. ByteArrayInputStreamisBm=newByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
  11. Bitmapbitmap=BitmapFactory.decodeStream(isBm,null,null);//把ByteArrayInputStream数据生成图片
  12. returnbitmap;
  13. }

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

Java代码收藏代码
  1. privateBitmapgetimage(StringsrcPath){
  2. BitmapFactory.OptionsnewOpts=newBitmapFactory.Options();
  3. //开始读入图片,此时把options.inJustDecodeBounds设回true了
  4. newOpts.inJustDecodeBounds=true;
  5. Bitmapbitmap=BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空
  6. newOpts.inJustDecodeBounds=false;
  7. intw=newOpts.outWidth;
  8. inth=newOpts.outHeight;
  9. //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
  10. floathh=800f;//这里设置高度为800f
  11. floatww=480f;//这里设置宽度为480f
  12. //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
  13. intbe=1;//be=1表示不缩放
  14. if(w>h&&w>ww){//如果宽度大的话根据宽度固定大小缩放
  15. be=(int)(newOpts.outWidth/ww);
  16. }elseif(w<h&&h>hh){//如果高度高的话根据宽度固定大小缩放
  17. be=(int)(newOpts.outHeight/hh);
  18. }
  19. if(be<=0)
  20. be=1;
  21. newOpts.inSampleSize=be;//设置缩放比例
  22. //重新读入图片,注意此时已经把options.inJustDecodeBounds设回false了
  23. bitmap=BitmapFactory.decodeFile(srcPath,newOpts);
  24. returncompressImage(bitmap);//压缩好比例大小后再进行质量压缩
  25. }

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

Java代码收藏代码
  1. privateBitmapcomp(Bitmapimage){
  2. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  3. image.compress(Bitmap.CompressFormat.JPEG,100,baos);
  4. if(baos.toByteArray().length/1024>1024){//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
  5. baos.reset();//重置baos即清空baos
  6. image.compress(Bitmap.CompressFormat.JPEG,50,baos);//这里压缩50%,把压缩后的数据存放到baos中
  7. }
  8. ByteArrayInputStreamisBm=newByteArrayInputStream(baos.toByteArray());
  9. BitmapFactory.OptionsnewOpts=newBitmapFactory.Options();
  10. //开始读入图片,此时把options.inJustDecodeBounds设回true了
  11. newOpts.inJustDecodeBounds=true;
  12. Bitmapbitmap=BitmapFactory.decodeStream(isBm,null,newOpts);
  13. newOpts.inJustDecodeBounds=false;
  14. intw=newOpts.outWidth;
  15. inth=newOpts.outHeight;
  16. //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
  17. floathh=800f;//这里设置高度为800f
  18. floatww=480f;//这里设置宽度为480f
  19. //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
  20. intbe=1;//be=1表示不缩放
  21. if(w>h&&w>ww){//如果宽度大的话根据宽度固定大小缩放
  22. be=(int)(newOpts.outWidth/ww);
  23. }elseif(w<h&&h>hh){//如果高度高的话根据宽度固定大小缩放
  24. be=(int)(newOpts.outHeight/hh);
  25. }
  26. if(be<=0)
  27. be=1;
  28. newOpts.inSampleSize=be;//设置缩放比例
  29. //重新读入图片,注意此时已经把options.inJustDecodeBounds设回false了
  30. isBm=newByteArrayInputStream(baos.toByteArray());
  31. bitmap=BitmapFactory.decodeStream(isBm,null,newOpts);
  32. returncompressImage(bitmap);//压缩好比例大小后再进行质量压缩
  33. }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics