图片压缩的三种方法?
来源:互联网 发布:短信数据恢复软件 编辑:程序博客网 时间:2024/04/30 10:03
android 图片压缩方法:
第一:质量压缩法:
private Bitmap compressImage(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int options = 100;
while ( baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset();//重置baos即清空baos
options -= 10;//每次都减少10
image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
return bitmap;
}
第二:图片按比例大小压缩方法(根据路径获取图片并压缩):
private Bitmap getimage(String srcPath) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
//开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空
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);//压缩好比例大小后再进行质量压缩
}
图片比例压缩时, 我看到一个算法,说比较快。。
be = (int) ((w / STANDARD_WIDTH + h/ STANDARD_HEIGHT) / 2);
结论二:图片比例压缩倍数 就是 (宽度压缩倍数+高度压缩倍数)/2..
第三:图片按比例大小压缩方法(根据Bitmap图片压缩):
private Bitmap comp(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
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中
}
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;//设置缩放比例
newOpts.inPreferredConfig = Config.RGB_565;//降低图片从ARGB888到RGB565
//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
isBm = new ByteArrayInputStream(baos.toByteArray());
bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
return compressImage(bitmap);//压缩好比例大小后再进行质量压缩
}
- Android图片压缩的三种方法
- 图片压缩的三种方法?
- 图片的三种压缩方法
- Android中常用的三种图片压缩方法
- 三种Android图片压缩方法 压缩到指定大小
- 三种Android图片压缩方法 压缩到指定大小
- 三种图片的压缩方式
- android图片压缩的三种方式
- 对于图片压缩的 三种方式
- Android图片压缩的三种方式
- android图片压缩的三种方式
- android图片压缩的三种方式
- 图片压缩的方法
- 压缩图片的方法
- android 图片压缩的三种方法,其实还有第四种就是2.2以后提供的压缩类
- 图片的压缩的几种方法
- Android压缩图片的几种方法
- Android压缩图片的几种方法
- Maven入门指南⑦:Maven的生命周期和插件
- Android studio 导入HTML文件
- [分享] 用NodeJs做一个小爬虫,附源码!
- Golang 1.7.3 Context 简单用法.类似sync.WaitGroup
- Ubuntu 14.04 不能使用 MTK Flash Tools 问题解决方法
- 图片压缩的三种方法?
- POJ 2051 Argus(堆排序 or STL优先队列)
- 算法竞赛与入门经典 (第一章)
- java方法引用
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- ActiveMQ之P2P点对点通信方式
- javascript基础
- android沉浸式状态栏
- 图片加载框架-Fresco