Android 系统自带的图片模糊效果 RenderScript

2016-10-30  本文已影响422人  Anenn

前言

与目前市场上的其他移动平台相比,基于 Java 语言的 Android 系统在执行计算密集型(Computationally intensive)任务时是很慢的。为此,Android 系统提供了 RenderScript 这个框架,该框架可以充分利用设备的多核性能来高效的执行计算算法。然而,早期的 RenderScript 仅支持 Android 4.3 及以上版本。不过幸运的是,后面 Google 又推出了 RenderScript 的兼容包,使其可以在 Android 2.2 及以上的系统中正常执行。

集成 RenderSript Support Library

如果你还在使用 Eclipse + ADT 作为你的开发环境,那么要想集成 RenderScriprt Support Library 到你的工程还是比较麻烦的。所以在这里我先假定你的开发环境是 Android Studio,Eclipse 使用者则请另行查阅。

提到 Android Studio,那么自然而然的就会想到与它相绑定的一个自动化构建工具 Gradle。没错,我们只需要在 module(如 app) 目录下的 build.gradle 文件中添加如下两行代码即可,同时也不需要再申明其他任何的依赖。不过配置信息还是要根据你当前使用的 Gradle 版本进行相应修改:

Gradle version 0.14+

android {
    defaultConfig {
        renderscriptTargetApi 19
        renderscriptSupportModeEnabled true
    }
}

Gradle version 0.13-

android {
    defaultConfig {
        renderscriptTargetApi 19
        renderscriptSuppoertMode true
    }
}

接下来只需同步一下工程我们就可以使用 RenderScript Support Library。这里需要注意的是,为了能使我们的工程运行在 Android 2.2及以上的设备,请正确选择 android.support.v8.renderscript.* 包下的类。如果你不考虑兼容低版本,那直接使用 android.renderscript.* 就可以了。

使用 RenderScript Support Library 对我们的图片进行模糊处理

完成上述的配置后,我们就可以使用 RenderSrcipt 来处理我们的图片了。Talk is cheap,show me the code:

public class BlurBuilder {  
   private static final float BLUR_RADIUS = 7.5F;

    public static Bitmap blur(Context context, Bitmap inputBitmap) {

    Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);

    RenderScript renderScript = RenderScript.create(context);
    ScriptIntrinsicBlur scriptIntrinsicBlur =
        ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript));
    Allocation tmpIn = Allocation.createFromBitmap(renderScript, inputBitmap);
    Allocation tmpOut = Allocation.createFromBitmap(renderScript, outputBitmap);
    scriptIntrinsicBlur.setRadius(BLUR_RADIUS);
    scriptIntrinsicBlur.setInput(tmpIn);
    scriptIntrinsicBlur.forEach(tmpOut);
    tmpOut.copyTo(outputBitmap);

    return outputBitmap;
  }
}

上面代码就简单实现了将一个 Bitmap 资源进行模糊处理,然后我们就可以调用了:

ImageView ivPhoto = (ImageView) findViewById(R.id.iv_photo);
    BitmapDrawable bitmapDrawable =
        (BitmapDrawable) ContextCompat.getDrawable(getApplicationContext(), R.mipmap.ic_launcher);
    ivPhoto.setImageDrawable(new BitmapDrawable(getResources(),
        BlurBuilder.blur(getApplicationContext(), bitmapDrawable.getBitmap())));

最终效果如下:


参考文献

  1. How to Use the Renderscript Support Library with Gradle-Based Android Projects
  2. How to Blur Images Efficiently with Android's RenderScript
上一篇下一篇

猜你喜欢

热点阅读