當前位置:
首頁 > 最新 > Glide 系列(七)Glide圖像變換

Glide 系列(七)Glide圖像變換

前言

通過前面Glide系列文章的閱讀,相信大家對Glide的核心流程及部分關鍵模塊已經有了較為深入的了解,本節我們繼續深入介紹Glide中的重要模塊。在平時的開發需求中,有時需要對原圖片進行一定的處理後再顯示出來,以產生更加豐富的展示效果,比如對圖片進行裁剪,高斯模糊,圓角處理,美化處理等等,如何添加這些個性化的圖片需求,Glide框架提供了相關的介面,可以輕鬆接入我們需要的圖片變換功能。


流程回顧

在講這部分前,先思考一下,如果我們需要對圖片進行顯示效果的處理,首先應該拿到原圖片,對圖片進行相應的處理操作後將結果返回給後續流程,因此圖片變換的處理時機應在對數據流解碼之後,回顧一下前面章節Glide圖片載入的部分流程,如下圖所示

由流程圖中可以看到,DecodeJob 在發起網路請求獲取到數據流之後,會對數據流進行解碼處理得到bitmap數據,然後調用到transformEncodeAndTranscode方法,這個方法中先對圖像進行變換處理,使用到圖像變換器transformation中的transform方法,在這裡面完成對圖像相應的處理流程,看下相關源碼。


那這個圖像變換器transformation是如何設置的呢,設置方法非常簡單如下代碼所示,只需要調用transform方法傳入所需要的圖像變換器即可,可以根據需要傳入一個或多個圖像變換器:

參考前面對Glide核心流程的源碼分析,調用load方法之後會返回一個DrawableTypeRequest類型的對象,transform最終調用到其父類GenericRequestBuilder 中的transform方法,用於設置圖像變換器參數,並將其封裝到GenericRequest中, 供圖像解碼之後的流程使用,如下部分源碼所示:


可以看到圖像變換器的設置方法是非常簡單的,圖像變換最關鍵的是處理演算法的實現,如何來實現一個具體的圖像變換功能呢,Glide中給我們提供了幾個現成的圖片變換功能,我們以Glide中自帶的圖形變換功能 CenterCrop作為例子來看如何實現一個圖像變換器,並應用到圖像載入中。CenterCrop的源碼如下所示:

centercrop是一種圖像裁剪演算法,等比例縮放原圖直到填滿ImageView為止,對多出來的部分進行裁剪,ImageView 完全填充,圖像可能會被裁減掉一部分。Glide 中的CenterCrop 繼承自 BitmapTransformation 類 (靜態圖像的變換類型都是繼承BitmapTransformation)。 主要實現了transform 方法,在transform方法中完成對圖像裁剪的計算和處理。另外還實現了getId方法,用來區分不同的變換類型。我們繼續看transform方法,transform方法中共傳入四個參數,分別是用於bitmap復用的bitmapool,圖像變換前的原圖 toTransform, 指定的變換後的圖像寬高(可以通過override方法來設置)。在CenterCrop變換中,首先從bitmappool中取出一個可復用的bitmap,用於保存變換後的bitmap,(這裡穿插一句,為了防止頻繁創建bitmap對象而產生大量的內存消耗,Glide中使用 bitmappool來對bitmap進行復用,在平時對bitmap的使用中,從內存優化的角度我們可以借鑒這一做法),然後將這些參數傳入TransformationUtils.centerCrop 方法,在這裡面根據設置的尺寸及圖像原始寬高進行計算,完成的圖像裁切功能,如下源碼所示:


由此可見,實現一個圖像變換器,只需要繼承BitmapTransformation 類 (靜態圖像的變換類型都是繼承BitmapTransformation)。 實現transform 方法和getid方法。圖片變換的需求多種多樣,如果我們想要豐富的圖像展示效果,也不必全部自己來研究圖像處理演算法實現。目前已經有非常多Glide圖片變換的開源庫可以直接使用,比較全面的是glide-transformations這個庫,實現了非常豐富的圖片變換效果,例如裁剪變換、顏色變換、模糊變換等等,glide-transformations的GitHub地址是 https://github.com/wasabeef/glide-transformations 。可以看一下部分效果:

這個庫的使用也非常簡單,在app/build.gradle文件當中添加如下依賴:

然後就可以開心的玩耍了,例如對圖像進行模糊處理只需如下代碼即可:

使用圖像顏色濾鏡效果:

至此對Glide圖像變換這一部分的內容就講解完了,對自定義圖像變換模塊以及如何使用圖像變換功能進行了詳細的介紹。後續我們會繼續深入介紹Glide關鍵模塊知識,歡迎繼續關注。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 野生的安卓獸 的精彩文章:

TAG:野生的安卓獸 |