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


原文地址: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. }

更多相关文章

  1. 2011.10.14——— android 仿照微信的图片展示功能 之 基本功能
  2. 流媒体开发之-服务器图片的加载
  3. Android开发教程--设置ImageView图片的显示比例
  4. 麦子学院android老师分享android实现listview异步加载图片的方法
  5. Android Glide加载图片,宽度占满屏幕高度自适应
  6. Android 控件ImageView图片框
  7. android异步加载图片显示,并且对图片进行缓存实例
  8. Android显示网络图片实例

随机推荐

  1. 分享30个非常实用的游戏和应用源码
  2. 分享30个非常实用的游戏和应用源码
  3. Android(安卓)选择控件
  4. Android高级编程PDF
  5. 【Android入门】新手入门布局源码及零基
  6. android的TextView跑马灯效果属性
  7. Android(安卓)项目优化(七):阿里巴巴Android
  8. Android7.0中文API -- Spinner
  9. Android(安卓)项目优化(七):阿里巴巴Android
  10. 浅析Android手机卫士之手机实现短信指令