Android圖片載入框架最全解析(五),Glide強大的圖片變換功能(筆記)
阿新 • • 發佈:2018-11-12
參考原文:Android圖片載入框架最全解析(五),Glide強大的圖片變換功能
一個問題
百度這張logo圖片的尺寸只有540258畫素,但是我的手機的解析度卻是10801920畫素,而我們將ImageView的寬高設定的都是wrap_content,那麼圖片的寬度應該只有手機螢幕寬度的一半而已,但是這裡卻充滿了全屏,這是為什麼呢?
Glide.with(this)
.load(url)
.dontTransform()
.into(imageView);
Glide.with(this)
.load(url)
. override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.into(imageView);
圖片變換的基本用法
String url = "http://cn.bing.com/az/hprichbg/rb/AvalancheCreek_ROW11173354624_1920x1080.jpg";
Glide.with(this)
.load(url)
.override(500, 500)
.centerCrop()
.into(imageView);
原始碼分析
首先,CenterCrop是繼承自BitmapTransformation的,這個是重中之重,因為整個圖片變換功能都是建立在這個繼承結構基礎上的。物件連同toTransform、outWidth、outHeight引數一起傳入到了TransformationUtils.centerCrop()方法當中
public final class TransformationUtils {
public static Bitmap centerCrop(Bitmap recycled, Bitmap toCrop, int width, int height) {
if (toCrop == null) {
return null;
} else if (toCrop.getWidth() == width && toCrop.getHeight() == height) {
return toCrop;
}
// From ImageView/Bitmap.createScaledBitmap.
final float scale;
float dx = 0, dy = 0;
Matrix m = new Matrix();
if (toCrop.getWidth() * height > width * toCrop.getHeight()) {
scale = (float) height / (float) toCrop.getHeight();
dx = (width - toCrop.getWidth() * scale) * 0.5f;
} else {
scale = (float) width / (float) toCrop.getWidth();
dy = (height - toCrop.getHeight() * scale) * 0.5f;
}
m.setScale(scale, scale);
m.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));
final Bitmap result;
if (recycled != null) {
result = recycled;
} else {
result = Bitmap.createBitmap(width, height, getSafeConfig(toCrop));
}
// We don't add or remove alpha, so keep the alpha setting of the Bitmap we were given.
TransformationUtils.setAlpha(toCrop, result);
Canvas canvas = new Canvas(result);
Paint paint = new Paint(PAINT_FLAGS);
canvas.drawBitmap(toCrop, m, paint);
return result;
}
自定義圖片變換
Glide.with(this)
.load(url)
.transform(new CircleCrop(this))
.into(imageView);
更多圖片變換功能
網上出現了很多Glide的圖片變換開源庫,其中做的最出色的應該要數glide-transformations這個庫了。它實現了很多通用的圖片變換效果,如裁剪變換、顏色變換、模糊變換等等,使得我們可以非常輕鬆地進行各種各樣的圖片變換。
glide-transformations的專案主頁地址是 https://github.com/wasabeef/glide-transformations 。
比如同時執行模糊化和黑白化的變換:
lide.with(this)
.load(url)
.bitmapTransform(new BlurTransformation(this), new GrayscaleTransformation(this))
.into(imageView);