请选择 进入手机版 | 继续访问电脑版
设为首页 收藏本站
开启辅助访问 切换到宽版

新浪微博登陆

只需一步, 快速开始

QQ登录

只需一步,快速开始

切换风格 立即注册 找回密码

Java教程网

查看: 45190|回复: 30

JAVA实现压缩bitmap图片

[复制链接]

新浪微博达人勋

3092

积分

775

帖子

772

贡献

Rank: 8Rank: 8

积分
3092
发表于 2016-12-16 19:54:52 | 显示全部楼层 |阅读模式
具体代码如下
  1. 第一:我们先看下质量压缩方法:
  2. private Bitmap compressImage(Bitmap image) {  
  3.   
  4.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  5.         image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  
  6.         int options = 100;  
  7.         while ( baos.toByteArray().length / 1024>100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩         
  8.             baos.reset();//重置baos即清空baos  
  9.             image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中  
  10.             options -= 10;//每次都减少10  
  11.         }  
  12.         ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中  
  13.         Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片  
  14.         return bitmap;  
  15.     }  
复制代码
  1. 第二:图片按比例大小压缩方法(根据路径获取图片并压缩):   
  2. private Bitmap getimage(String srcPath) {  
  3.         BitmapFactory.Options newOpts = new BitmapFactory.Options();  
  4.         //开始读入图片,此时把options.inJustDecodeBounds 设回true了  
  5.         newOpts.inJustDecodeBounds = true;  
  6.         Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空  
  7.          
  8.         newOpts.inJustDecodeBounds = false;  
  9.         int w = newOpts.outWidth;  
  10.         int h = newOpts.outHeight;  
  11.         //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  
  12.         float hh = 800f;//这里设置高度为800f  
  13.         float ww = 480f;//这里设置宽度为480f  
  14.         //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  
  15.         int be = 1;//be=1表示不缩放  
  16.         if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放  
  17.             be = (int) (newOpts.outWidth / ww);  
  18.         } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放  
  19.             be = (int) (newOpts.outHeight / hh);  
  20.         }  
  21.         if (be <= 0)  
  22.             be = 1;  
  23.         newOpts.inSampleSize = be;//设置缩放比例  
  24.         //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  
  25.         bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
  26.         return compressImage(bitmap);//压缩好比例大小后再进行质量压缩  
  27.     }  
复制代码
  1. 第三:图片按比例大小压缩方法(根据Bitmap图片压缩):
  2. private Bitmap comp(Bitmap image) {  
  3.       
  4.     ByteArrayOutputStream baos = new ByteArrayOutputStream();         
  5.     image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  
  6.     if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出   
  7.         baos.reset();//重置baos即清空baos  
  8.         image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中  
  9.     }  
  10.     ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  
  11.     BitmapFactory.Options newOpts = new BitmapFactory.Options();  
  12.     //开始读入图片,此时把options.inJustDecodeBounds 设回true了  
  13.     newOpts.inJustDecodeBounds = true;  
  14.     Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
  15.     newOpts.inJustDecodeBounds = false;  
  16.     int w = newOpts.outWidth;  
  17.     int h = newOpts.outHeight;  
  18.     //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为  
  19.     float hh = 800f;//这里设置高度为800f  
  20.     float ww = 480f;//这里设置宽度为480f  
  21.     //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可  
  22.     int be = 1;//be=1表示不缩放  
  23.     if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放  
  24.         be = (int) (newOpts.outWidth / ww);  
  25.     } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放  
  26.         be = (int) (newOpts.outHeight / hh);  
  27.     }  
  28.     if (be <= 0)  
  29.         be = 1;  
  30.     newOpts.inSampleSize = be;//设置缩放比例  
  31.     //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了  
  32.     isBm = new ByteArrayInputStream(baos.toByteArray());  
  33.     bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
  34.     return compressImage(bitmap);//压缩好比例大小后再进行质量压缩  
  35. }  
复制代码




来自群组: java开发组

新浪微博达人勋

3007

积分

783

帖子

738

贡献

Rank: 8Rank: 8

积分
3007
发表于 2016-12-16 19:56:06 | 显示全部楼层
是爷们的娘们的都帮顶!大力支持

新浪微博达人勋

2763

积分

696

帖子

689

贡献

Rank: 6Rank: 6

积分
2763
发表于 2016-12-21 15:41:44 | 显示全部楼层
支持,楼下的跟上哈~

新浪微博达人勋

3104

积分

776

帖子

776

贡献

Rank: 8Rank: 8

积分
3104

社区QQ达人

发表于 2016-12-25 19:47:42 | 显示全部楼层
看起来不错

新浪微博达人勋

2924

积分

731

帖子

731

贡献

Rank: 6Rank: 6

积分
2924
发表于 2017-1-3 00:18:45 | 显示全部楼层
我擦!我要沙发!

新浪微博达人勋

6430

积分

1606

帖子

1608

贡献

Rank: 8Rank: 8

积分
6430

社区QQ达人

发表于 2017-1-3 13:22:20 | 显示全部楼层
边撸边过

新浪微博达人勋

7162

积分

1815

帖子

1764

贡献

Rank: 8Rank: 8

积分
7162

社区QQ达人最佳新人活跃会员热心会员

发表于 2017-1-4 11:56:22 | 显示全部楼层
啊啊啊啊啊啊啊啊啊啊啊

新浪微博达人勋

2976

积分

744

帖子

744

贡献

Rank: 6Rank: 6

积分
2976
发表于 2017-1-19 16:41:35 | 显示全部楼层
支持支持再支持

新浪微博达人勋

6607

积分

1651

帖子

1652

贡献

Rank: 8Rank: 8

积分
6607
发表于 2017-2-8 01:48:39 | 显示全部楼层
顶起顶起顶起

新浪微博达人勋

2877

积分

749

帖子

708

贡献

Rank: 6Rank: 6

积分
2877

社区QQ达人

发表于 2017-2-27 09:26:40 | 显示全部楼层
有空一起交流一下
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋|手机版|Archiver|Java教程网    

GMT+8, 2019-5-27 19:52 , Processed in 0.328125 second(s), 44 queries .

Powered by Discuz X3.2

© 2001-2013 JAVA教程网

快速回复 返回顶部 返回列表