信息备份:
我们默认了下载下来的图片的大小是已经设定好的。当然,在实际开发中,我们下载再来的图片,可能也是和服务端沟通好设定好了。但是,有时候,图片下载下来很大,这个时候,就需要对图片进行压缩了。一般而言,图片的压缩有两种,质量压缩和宽高压缩。我们来看一个工具类。
//图片质量压缩
public
static
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
image.compress(Bitmap.CompressFormat.JPEG, options, baos);
// 这里压缩options%,把压缩后的数据存放到baos中
options -=
10
;
// 每次都减少10
}
ByteArrayInputStream isBm =
new
ByteArrayInputStream(baos.toByteArray());
// 把压缩后的数据baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm,
null
,
null
);
// 把ByteArrayInputStream数据生成图片
return
bitmap;
}
//图片宽高压缩
public
static
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;
// 这个设置图片的宽高,根据实际需要设定
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);
// 压缩好比例大小后再进行质量压缩
}
有时候,我们还可以让系统自动的给我们压缩,只要确保不会出现OOM错误又能让图片以最大性能去展示
File file = Image.getFileFromSDCard(name,
"pure"
);
Options opts =
new
Options();
opts.inJustDecodeBounds =
true
;
BitmapFactory.decodeFile(file.getAbsolutePath(), opts);
opts.inJustDecodeBounds =
false
;
// 根据设定的值让系统自动压缩,这行代码的参数是第一个是BitmapFactory.Options,第二个参数是调整后图片最小的宽或者高,第三个参数是调整后图片的内存占用量上限。
opts.inSampleSize = Util.computeSampleSize(opts,
600
,(
int
) (
1
*
1024
*
1024
));
opts.inDither =
false
;
<span style=
"white-space:pre"
> </span>opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), opts);
本文摘自:http://www.2cto.com/kf/201502/374733.html
http://www.bubuko.com/infodetail-608998.html
http://www.68idc.cn/help/buildlang/ask/20150202204144.html