赞
踩
写在前面
最近一直在做毕设项目的准备工作,考虑到可能要用到一个模糊的效果,所以就学习了一些高斯模糊效果的实现。比较有名的就是 FastBlur 以及它衍生的一些优化方案,还有就是今天要说的RenderScript 。
因为这东西是现在需要才去学习的,所以关于一些图像处理和渲染问题就不提了。不过在使用的过程中确实能感受到,虽然不同的方案都能实现相同的模糊效果,但是效率差别真的很大。
本篇文章实现的高斯模糊是根据下面这篇文章学习的,先推荐一下。本文内容与其内容差不多,只是稍微讲的详细一点,并修改了代码中部分实现逻辑和细节上的处理。不过主体内容不变,所以选择哪篇文章去学都是一样的。
下面就来看一下,如何去实现这样的高斯模糊效果。
简单聊聊 Renderscript
因为效果的实现是基于 Renderscript 的,所以有必要先来了解一下。
从它的官方文档来看,说的很是玄乎。我们只需要知道一点就好了:
RenderScript is a framework for running computationally intensive tasks at high performance on Android.
Renderscript 是 Android 平台上进行高性能计算的框架。
既然是高性能计算,那么说明 RenderScript 对图像的处理非常强大,所以用它来实现高斯模糊还是比较好的选择。
那么如何使用它呢?从官方文档中可以看到,如果需要在 Java 代码中使用 Renderscript 的话,就必须依赖 android.renderscript 或者android.support.v8.renderscript 中的 API 。既然有 API 那就好办多了。
下面简单说一下使用的步骤,这也是官方文档中的说明:
首先需要通过 Context 创建一个 Renderscript ;
其次通过创建的 Renderscript 来创建一个自己需要的脚本( ScriptIntrinsic ),比如这里需要模糊,那就是 ScriptIntrinsicBlur ;
然后至少创建一个 Allocation 类来创建、分配内存空间;
接着就是对图像进行一些处理,比如说模糊处理;
处理完成后,需要刚才的 Allocation 类来填充分配好的内存空间;
最后可以选择性的对一些资源进行回收。
文档中的解释永远很规矩,比较难懂,我们结合原博主 湫水长天 的代码来看一看步骤:
/**
* @author Qiushui
* @description 模糊图片工具类
* @revision Xiarui 16.09.05
*/
public class BlurBitmapUtil {
//图片缩放比例
private static final float BITMAP_SCALE = 0.4f;
/**
* 模糊图片的具体方法
*
* @param context 上下文对象
* @param image 需要模糊的图片
* @return 模糊处理后的图片
*/
public static Bitmap blurBitmap(Context context, Bitmap image,float blurRadius) {
// 计算图片缩小后的长宽
int width = Math.round(image.getWidth() * BITMAP_SCALE);
int height = Math.round(image.getHeight() * BITMAP_SCALE);
// 将缩小后的图片做为预渲染的图片
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类来创建和分配内存空间
<Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。