Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 如何在没有工件的情况下使用Renderscript模糊效果?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
背景

有很多地方(包括here)显示如何使用Renderscript模糊图像,如下所示:

@TargetApi(VERSION_CODEs.jeLLY_BEAN_MR1)
public static Bitmap renderScriptBlur(Context context,Bitmap srcBitmap,@FloatRange(from = 0.0f,to = 25.0f) float radius) {
    if (srcBitmap == null)
        return null;
    Bitmap outputBitmap = null;
    RenderScript rs = null;
    try {
        rs = RenderScript.create(context);
        outputBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(outputBitmap);
        canvas.drawBitmap(srcBitmap,@R_262_6633@
        AlLOCATIOn overlayAlloc = AlLOCATIOn.createFromBitmap(rs,outputBitmap);
        ScripTintrinsicBlur blur = ScripTintrinsicBlur.create(rs,Element.U8_4(rs));
        blur.seTinput(overlayAlloc);
        blur.seTradius(radius);
        blur.forEach(overlayAlloc);
        overlayAlloc.copyTo(outputBitmap);
        return outputBitmap;
    } catch (Exception eX) {
        if (outputBitmap != null)
            outputBitmap.recycle();
        return srcBitmap;
    } finally {
        if (rs != null)
            rs.destroy();
    }
}

问题

通常它工作得很好,但是当使用一些图像和/或半径设置时,输出图像具有看起来像扫描线的工件:

android – 如何在没有工件的情况下使用Renderscript模糊效果?

我试过的

我发现有一个更好的模糊解决方案(如here),但它们不使用Renderscript,也很慢并且耗费内存.

我也尝试使输入图像更小,但输出仍然有扫描线伪像.

最后,我还报道了这个,here.

这个问题

是否有可能使用Renderscript模糊图像而没有那些Artifcats?我写的是什么问题?

解决方法

问题出在我使用的算法上.感谢 this github项目,我发现了问题(可能没有使用正确的分配类型)并使用了更好的方法

private static final AtomicReference<RenderScript> sRenderscript = new AtomicReference<>();


public static Bitmap blur(Context context,Bitmap bitmap) {
    return blur(context,bitmap,4,false,falsE);
}

public static Bitmap blur(Context context,Bitmap bitmap,float radius) {
    return blur(context,radius,Bitmap bitmapOriginal,to = 25.0f) float radius,Boolean overrideOriginal,Boolean recycLeoriginal) {
    if (bitmapOriginal == null || bitmapOriginal.isRecycled())
        return null;
    RenderScript rs = sRenderscript.get();
    if (rs == null)
        if (!sRenderscript.compareAndSet(null,rs = RenderScript.create(context)) && rs != null)
            rs.destroy();
        else
            rs = sRenderscript.get();
    final Bitmap inputBitmap = bitmapOriginal.getConfig() == Config.ARGB_8888 ? bitmapOriginal : bitmapOriginal.copy(Config.ARGB_8888,truE);
    final Bitmap outputBitmap = overrideOriginal ? bitmapOriginal : Bitmap.createBitmap(bitmapOriginal.getWidth(),bitmapOriginal.getHeight(),Config.ARGB_8888);
    final AlLOCATIOn input = AlLOCATIOn.createFromBitmap(rs,inputBitmap);
    final AlLOCATIOn output = AlLOCATIOn.createTyped(rs,input.getType());
    final ScripTintrinsicBlur script = ScripTintrinsicBlur.create(rs,Element.U8_4(rs));
    script.seTradius(radius);
    script.seTinput(input);
    script.forEach(output);
    if (recycLeoriginal && !overrideOriginal)
        bitmapOriginal.recycle();
    output.copyTo(outputBitmap);
    return outputBitmap;
}

现在一切顺利.

大佬总结

以上是大佬教程为你收集整理的android – 如何在没有工件的情况下使用Renderscript模糊效果?全部内容,希望文章能够帮你解决android – 如何在没有工件的情况下使用Renderscript模糊效果?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。