Android图片压缩方式
来源:互联网 发布:核密度估计算法 编辑:程序博客网 时间:2024/05/29 19:54
一.图片的存在形式
1.文件形式(即以二进制形式存在于硬盘上)
2.流的形式(即以二进制形式存在于内存中)
3.Bitmap形式
2.流的形式(即以二进制形式存在于内存中)
3.Bitmap形式
这三种形式的区别: 文件形式和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式读到内存中,也一定是占100K的内存,注意是流的形式,不是Bitmap的形式,当图片以Bitmap的形式存在时,其占用的内存会瞬间变大, 500K文件形式的图片加载到内存,以Bitmap形式存在时,占用内存将近10M,当然这个增大的倍数并不是固定的
检测图片三种形式大小的方法:
文件形式: file.length()
流的形式: 讲图片文件读到内存输入流中,看它的byte数
二.常见的压缩方式
*******************************图片压缩两种方式*******************************************
一.质量压缩法
/** * 压缩方式一:质量压缩方法 * * @param image * @return */public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); //质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 image.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 100; //循环判断如果压缩后图片是否大于100kb,大于继续压缩 while (baos.toByteArray().length / 1024 > 100) { //重置baos即清空baos baos.reset(); //这里压缩options%,把压缩后的数据存放到baos中 image.compress(Bitmap.CompressFormat.JPEG, options, baos); options -= 10;//每次都减少10 } //把压缩后的数据baos存放到ByteArrayInputStream中 ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); //把ByteArrayInputStream数据生成图片 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null); return bitmap;}
二.图片按比例压缩
/** * 压缩方式二:图片按比例大小压缩方法(根据路径获取图片并压缩) * * @param srcPath * @return */public static Bitmap getimage(String srcPath) { BitmapFactory.Options newOpts = new BitmapFactory.Options(); //开始读入图片,此时把options.inJustDecodeBounds 设回true了 newOpts.inJustDecodeBounds = true; //此时返回bm为空 Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts); newOpts.inJustDecodeBounds = false; int w = newOpts.outWidth; int h = newOpts.outHeight; //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 float hh = 800f;//这里设置高度为800f float ww = 480f;//这里设置宽度为480f //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 int be = 1;//be=1表示不缩放 if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放 be = (int) (newOpts.outWidth / ww); } else if (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); return compressImage(bitmap);//压缩好比例大小后再进行质量压缩}/** * 压缩方式三:图片按比例大小压缩方法(根据Bitmap图片压缩) * * @param image * @return */public static Bitmap comp(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); //判断如果图片大于1M,进行压缩避免在生成图片 //(BitmapFactory.decodeStream)时溢出 if (baos.toByteArray().length / 1024 > 1024) { baos.reset();//重置baos即清空baos //这里压缩50%,把压缩后的数据存放到baos中 image.compress(Bitmap.CompressFormat.JPEG, 50, baos); } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); BitmapFactory.Options newOpts = new BitmapFactory.Options(); //开始读入图片,此时把options.inJustDecodeBounds 设回true了 newOpts.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts); newOpts.inJustDecodeBounds = false; int w = newOpts.outWidth; int h = newOpts.outHeight; //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 float hh = 800f;//这里设置高度为800f float ww = 480f;//这里设置宽度为480f //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 int be = 1;//be=1表示不缩放 if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放 be = (int) (newOpts.outWidth / ww); } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放 be = (int) (newOpts.outHeight / hh); } if (be <= 0) be = 1; newOpts.inSampleSize = be;//设置缩放比例 //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了 isBm = new ByteArrayInputStream(baos.toByteArray()); bitmap = BitmapFactory.decodeStream(isBm, null, newOpts); return compressImage(bitmap);//压缩好比例大小后再进行质量压缩}
0 0
- Android图片压缩方式
- Android 图片压缩各种方式
- Android 中的两种压缩图片方式
- android图片压缩的三种方式
- Android图片压缩的几种方式
- Android图片压缩的三种方式
- android图片压缩的三种方式
- android图片压缩的三种方式
- Android中bitmap图片压缩方式
- Android中图片压缩方式总结
- Android 图片压缩之多种压缩方式结合使用
- Android 图片压缩之多种压缩方式结合使用
- bitmap的六种压缩方式,Android图片压缩
- bitmap的六种压缩方式,Android图片压缩
- bitmap的六种压缩方式,Android图片压缩
- bitmap的六种压缩方式,Android图片压缩
- Android 图片压缩之多种压缩方式结合使用
- bitmap的六种压缩方式,Android图片压缩
- Combiner机制和使用
- UIImageView 属性 方法
- window.open() location=no 不起作用的解决方案
- 音频框架
- 设计模式-单例模式
- Android图片压缩方式
- 苹果运用怎么实现一个动画的启动页面
- linux常用命令—— 系统管理(六)
- Using Swift with Cocoa and Objective-C(第一部分)
- iOS 企业账号申请
- 服务器架构资料整理
- DecimalFormat 中的 # 与 0 的区别(中文帮助文档中翻译可能是错误的)
- python核心编程-正则表达式-产生测试数据
- 删除hive内部表,不会删除数据的方法探索