之前做项目时,有个需求是指定照片压缩到任意宽高尺寸上传给服务器。当时我自己写了个图片压缩方法,但是不够完美,小问题不断(比如OOM之类的)。后来看到了神器Picasso不光能加载网络图片,还能以任意尺寸加载本地图片。于是我想,既然Picasso能任意尺寸加载本地图片,那它肯定能任意宽高尺寸压缩图片了。仔细找了下,找到了对应的方法,我刚才测试了一下,发现确实可以满足我的需求,而且图片质量还很不错。在这里特此记录一下。
Picasso的github地址:https://github.com/square/picasso
代码如下:
(其中一定要万分注意,Target 不能直接new 出来,要像我下面一样声明为成员变量。因为Picasso 里面持有Target 用的是弱引用,你要是直接new 就有很大可能被GC回收导致接收不到回调。我快被坑哭了)
private Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.setImageBitmap(bitmap);
Log.v("tag_2","bitmap.getHeight() = " + bitmap.getHeight());
Log.v("tag_2","bitmap.getWidth() = " + bitmap.getWidth());
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
Picasso.with(MainActivity.this).load(uri).resize(806,902).centerCrop().into(target);
如果传图片地址:
Picasso.with(MainActivity.this).load(new File(path)).resize(806,902).centerCrop().into(target);
然后把回调里面的bitmap保存到本地就是我想要的结果了。
===============================
2017年2月18日补充:Android中指定任意宽高值,压缩Bitmap的原生API是这个:
Bitmap bm = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(path), 502, 302, true);
如果你觉得帮到了你,请给作者打赏一口饭吃: