package com.mjj.gaussianblur; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Build; import android.renderscript.Allocation; import android.renderscript.RenderScript; import android.renderscript.ScriptIntrinsicBlur; import android.widget.ImageView; /** * 高斯模糊 */ public class GaussianBlur { static { System.loadLibrary("jni-Demo"); } public static native int[] toGaussianBlur(int[] pix,int radius,int width,int height); public static native void toBoxBlur(int[] pix,int[] newPix,int radius,int width,int height); /** * 通过jni进行图片模糊,均值模糊算法 * @param bkg 需要模糊的bitmap * @param radius 模糊半径 * @param view 显示模糊图片的ImageView * @return 消耗时间,单位毫秒(ms) */ public static long blurByJni_box(Bitmap bkg, int radius, ImageView view) { long startMs = System.currentTimeMillis(); float scaleFactor = 8; int width = (int)(view.getMeasuredWidth()/scaleFactor); int height = (int)(view.getMeasuredHeight()/scaleFactor); Bitmap overlay = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(overlay); canvas.scale(1 / scaleFactor, 1 / scaleFactor); Paint paint = new Paint(); paint.setFlags(Paint.FILTER_BITMAP_FLAG); canvas.drawBitmap(bkg, 0, 0, paint); int[] pixels = new int[width*height]; overlay.getPixels(pixels, 0, width, 0, 0, width, height); int[] newPixels = new int[width*height]; toBoxBlur(pixels, newPixels, radius, width, height); overlay.setPixels(newPixels, 0, width, 0, 0, width, height); view.setImageBitmap(overlay); return System.currentTimeMillis() - startMs; } /** * 通过jni进行图片模糊,一维高斯算法 * @param bkg 需要模糊的bitmap * @param radius 模糊半径 * @param view 显示模糊图片的ImageView * @return 消耗时间,单位毫秒(ms) */ public static long blurByJni_Gaussian(Bitmap bkg, int radius, ImageView view) { long startMs = System.currentTimeMillis(); float scaleFactor = 8; int width = (int)(view.getMeasuredWidth()/scaleFactor); int height = (int)(view.getMeasuredHeight()/scaleFactor); Bitmap overlay = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(overlay); canvas.scale(1 / scaleFactor, 1 / scaleFactor); Paint paint = new Paint(); paint.setFlags(Paint.FILTER_BITMAP_FLAG); canvas.drawBitmap(bkg, 0, 0, paint); int[] pixels = new int[width * height]; overlay.getPixels(pixels, 0, width, 0, 0, width, height); int[] newPixels = toGaussianBlur(pixels,radius,width,height); overlay.setPixels(newPixels, 0, width, 0, 0, width, height); view.setImageBitmap(overlay); return System.currentTimeMillis() - startMs; } /** * 通过RenderScript进行图片模糊 * @param bkg 需要模糊的bitmap * @param radius 模糊半径,RenderScript规定范围为[1,25] * @param view 显示模糊图片的ImageView * @param context 上下文 * @return 消耗时间,单位毫秒(ms) */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public static long blurByRenderScript(Bitmap bkg,int radius, ImageView view,Context context) { long startMs = System.currentTimeMillis(); float scaleFactor = 8; int width = (int)(view.getMeasuredWidth()/scaleFactor); int height = (int)(view.getMeasuredHeight()/scaleFactor); Bitmap overlay = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(overlay); canvas.scale(1 / scaleFactor, 1 / scaleFactor); Paint paint = new Paint(); paint.setFlags(Paint.FILTER_BITMAP_FLAG); canvas.drawBitmap(bkg, 0, 0, paint); RenderScript rs = RenderScript.create(context); Allocation overlayAlloc = Allocation.createFromBitmap(rs, overlay); ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, overlayAlloc.getElement()); blur.setInput(overlayAlloc); blur.setRadius(radius); blur.forEach(overlayAlloc); overlayAlloc.copyTo(overlay); view.setImageBitmap(overlay); rs.destroy(); return System.currentTimeMillis() - startMs; } }