1. 程式人生 > >Android圖片載入框架最全解析(五),Glide強大的圖片變換功能(筆記)

Android圖片載入框架最全解析(五),Glide強大的圖片變換功能(筆記)

參考原文: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);