RenderScript主要在android中的對圖形進行處理,RenderScript採用C99語法進行編寫,主要優勢在於效能較高,本次記錄主要是利用RenderScript對圖片進行模糊化。
- 需要注意的地方:
如果只需要支援19以上的裝置,只需要使用android.renderscript包下的相關類即可,而如果需要向下相容,則需要使用android.support.v8.renderscript包下的相關類,兩個包的類的操作都是一樣的。
- 使用RenderScript的時候需要在build.gradle中新增如下程式碼:
defaultConfig { .................. renderscriptTargetApi 19 renderscriptSupportModeEnabled true }複製程式碼
使用android.support.v8.renderscript包時的坑:
當使用此包時,需要注意,經測試,當buildToolsVersion為23.0.3時,在4.4以上的部分裝置會崩潰,原因是因為沒有匯入libRSSupport.so包。當buildToolsVersion為23.0.1時,在4.4以上的部分裝置會崩潰,原因是沒有renderscript-v8.jar包,這兩個地方暫時沒有解決的辦法,所以在使用android.support.v8.renderscript包的時候,不要用23.0.3或者23.0.1進行構建,以免出錯。
下面是一個小例子工具類:
package com.chenh.RenderScript; import android.content.Context; import android.graphics.Bitmap; import android.support.v8.renderscript.Allocation; import android.support.v8.renderscript.Element; import android.support.v8.renderscript.RenderScript; import android.support.v8.renderscript.ScriptIntrinsicBlur; public class BlurBitmap { //圖片縮放比例 private static final float BITMAP_SCAL = 0.4f; //最大模糊度(在0.0到25.0之間) private static final float BLUR_RADIUS = 25f; /** * 模糊圖片的具體操作方法 * * @param context 上下文物件 * @param image 需要模糊的圖片 * @return 模糊處理後的圖片 */ public static Bitmap blur(Context context, Bitmap image) { //計算圖片縮小後的長寬 int width = Math.round(image.getWidth() * BITMAP_SCAL); int height = Math.round(image.getHeight() * BITMAP_SCAL); //將縮小後的圖片做為預渲染的圖片 Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false); //建立一張渲染後的輸出圖片 Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); //建立RenderScript核心物件 RenderScript rs = RenderScript.create(context); //建立一個模糊效果的RenderScript的工具物件 ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); //由於RenderScript並沒有使用VM來分配記憶體,所以需要使用Allocation類來建立和分配記憶體空間 //建立Allocation物件的時候其實記憶體是空的,需要使用copyTo()將資料填充進去。 Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap); Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap); //設定渲染的模糊程度,25f是最大模糊程度 blurScript.setRadius(BLUR_RADIUS); //設定blurScript物件的輸入記憶體 blurScript.setInput(tmpIn); //將輸出資料儲存到輸出記憶體中 blurScript.forEach(tmpOut); //將資料填充到Allocation中 tmpOut.copyTo(outputBitmap); return outputBitmap; } }複製程式碼