Android中关于图片压缩的小结
2016-07-28 11:18
393 查看
Android中如何进行图片压缩处理
一、我遇到的问题
工作中遇到的问题,有天领导让我把工程中所有需要上传图片的部分都要进行优化,把图片压缩后上传。我上网查了下发现有两种方式。一、质量压缩二、尺寸压缩。
二、网上的错误之处
关于这两个压缩的具体定义我就不多描述了,但是我查阅资料的时候发现网上好多文章都存在误解。大多数就认为先进行尺寸压缩后再进行质量压缩,后一步是无效。其实,这个说法是错误的,我为什么这样说呢?因为就算是先进行尺寸压缩再进行质量压缩也是有效的。
三、Android中图片的存在形式。
一、文件形式(即以二进制形式存于硬盘上)二、流的形式三、bitmap形式。三种形式的区别:文件和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式都到内存也是100K。但是当图片以bitmap形式存在时,其占用的内存会瞬间变大。这也就造成了当进行质量压缩后return bitmap形式后觉得压缩无效的错觉。重点就在于你return的是bitmap!
四、下面贴出我写的图片压缩代码(用了两种压缩方式)
public
class BitmapCompress {
public
static byte[] BitmapCompressToString(String srcPath) {
Bitmap bmp = compressImageFromFile(srcPath);
ByteArrayOutputStream baos =
new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int options = 100;
while (baos.toByteArray().length / 1024 > 150) {
options -= 10;// 每次都减少10
// 循环判断如果压缩后图片是否大于150kb,大于继续压缩
baos.reset();// 重置baos即清空baos
bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
Log.d("ROTK","baos"+baos.toByteArray().length);
// 这里压缩options%,把压缩后的数据存放到baos中
}
byte[] b = baos.toByteArray();
return b;
}
private
static Bitmap compressImageFromFile(String srcPath) {
BitmapFactory.Options newOpts =
new BitmapFactory.Options();
newOpts.inJustDecodeBounds =true;//
只读边,不读内容
Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
newOpts.inJustDecodeBounds =false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
float hh = 800f;//
float ww = 480f;//压缩为800*480的尺寸
int 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.ARGB_8888;//
该模式是默认的,可不设
newOpts.inPurgeable =true;// 同时设置才会有效
newOpts.inInputShareable =true;//
。当系统内存不够时候图片自动被回收
bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
return bitmap;//这里输出的事bitmap因为我们还要进行质量压缩的
}
}
恩,以上!
一、我遇到的问题
工作中遇到的问题,有天领导让我把工程中所有需要上传图片的部分都要进行优化,把图片压缩后上传。我上网查了下发现有两种方式。一、质量压缩二、尺寸压缩。
二、网上的错误之处
关于这两个压缩的具体定义我就不多描述了,但是我查阅资料的时候发现网上好多文章都存在误解。大多数就认为先进行尺寸压缩后再进行质量压缩,后一步是无效。其实,这个说法是错误的,我为什么这样说呢?因为就算是先进行尺寸压缩再进行质量压缩也是有效的。
三、Android中图片的存在形式。
一、文件形式(即以二进制形式存于硬盘上)二、流的形式三、bitmap形式。三种形式的区别:文件和流的形式对图片体积大小并没有影响,也就是说,如果你手机SD卡上的如果是100K,那么通过流的形式都到内存也是100K。但是当图片以bitmap形式存在时,其占用的内存会瞬间变大。这也就造成了当进行质量压缩后return bitmap形式后觉得压缩无效的错觉。重点就在于你return的是bitmap!
四、下面贴出我写的图片压缩代码(用了两种压缩方式)
public
class BitmapCompress {
public
static byte[] BitmapCompressToString(String srcPath) {
Bitmap bmp = compressImageFromFile(srcPath);
ByteArrayOutputStream baos =
new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int options = 100;
while (baos.toByteArray().length / 1024 > 150) {
options -= 10;// 每次都减少10
// 循环判断如果压缩后图片是否大于150kb,大于继续压缩
baos.reset();// 重置baos即清空baos
bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
Log.d("ROTK","baos"+baos.toByteArray().length);
// 这里压缩options%,把压缩后的数据存放到baos中
}
byte[] b = baos.toByteArray();
return b;
}
private
static Bitmap compressImageFromFile(String srcPath) {
BitmapFactory.Options newOpts =
new BitmapFactory.Options();
newOpts.inJustDecodeBounds =true;//
只读边,不读内容
Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
newOpts.inJustDecodeBounds =false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
float hh = 800f;//
float ww = 480f;//压缩为800*480的尺寸
int 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.ARGB_8888;//
该模式是默认的,可不设
newOpts.inPurgeable =true;// 同时设置才会有效
newOpts.inInputShareable =true;//
。当系统内存不够时候图片自动被回收
bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
return bitmap;//这里输出的事bitmap因为我们还要进行质量压缩的
}
}
恩,以上!
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories