使用原声RenderScript实现高斯模糊

/**
 * Created by kk on 17-4-26
 */

public class RenderscriptUtils {

    private static final String TAG = "kk";

    private Context context;
    private static RenderscriptUtils instance;

    public RenderscriptUtils(Context context) {
        this.context = context;
    }

    public static RenderscriptUtils getInstance(Context context) {

        if (null == instance) {
            instance = new RenderscriptUtils(context);
            return instance;
        }
        return instance;
    }


    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    public Bitmap blur(Bitmap bitmap, float radius) {
        if (bitmap == null) {
            return null;
        }
        if (context == null) {
            return null;
        }
        Bitmap output = Bitmap.createBitmap(bitmap); // 创建输出图片
        RenderScript rs = RenderScript.create(context); // 构建一个RenderScript对象
        ScriptIntrinsicBlur gaussianBlue = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); // 创建高斯模糊脚本
        Allocation allIn = Allocation.createFromBitmap(rs, bitmap); // 创建用于输入的脚本类型
        Allocation allOut = Allocation.createFromBitmap(rs, output); // 创建用于输出的脚本类型
        gaussianBlue.setRadius(radius); // 设置模糊半径,范围0f<radius<=25f
        gaussianBlue.setInput(allIn); // 设置输入脚本类型
        gaussianBlue.forEach(allOut); // 执行高斯模糊算法,并将结果填入输出脚本类型中
        allOut.copyTo(output); // 将输出内存编码为Bitmap,图片大小必须注意
        rs.destroy(); // 关闭RenderScript对象,API>=23则使用rs.releaseAllContexts()
        return output;
    }


    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void setImage(View v, Bitmap bitmap) {
        v.setBackground(new BitmapDrawable(context.getResources(), bitmap));
    }

    private void getBitmapFromNet(final View v, String url) {

        VolleyUtils volleyUtils = App.getInstance(context).getVolleyUtils();
        RequestQueue requestQueue = volleyUtils.getRequestQueue();

        ImageRequest imageRequest = new ImageRequest(url,
                new Response.Listener<Bitmap>() {

                    @Override
                    public void onResponse(Bitmap bitmap) {
                        Bitmap blurBitmap = blur(bitmap, 18f);
                        if (null != blurBitmap) {
                            setImage(v, blurBitmap);
                        }
                    }

                }, 500, 300, Bitmap.Config.ARGB_8888,
                new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError e) {
                        e.printStackTrace();
                        Log.e(TAG, "onErrorResponse: " + e.getErrorInfo().getMessage());
                    }
                });

        requestQueue.add(imageRequest);

    }


    public void setImageVague(final View v, final String uri) {

        if (null == context) {
            return;
        }

        getBitmapFromNet(v, uri);

    }


}

 

转载于:https://my.oschina.net/kkk3208/blog/891783

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值