圖片模糊效果實現(RenderScript)

chenToV發表於2017-10-09

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;
      }
    }複製程式碼

效果圖如下:

相關文章