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

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

概述背景 有很多地方(包括here)显示如何使用Renderscript模糊图像,如下所示: @TargetApi(VERSION_CODES.JELLY_BEAN_MR1)public static Bitmap renderScriptBlur(Context context, Bitmap srcBitmap, @FloatRange(from = 0.0f, to = 25.0f) floa 背景

有很多地方(包括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,null);        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();    }}

问题

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

我试过的

我发现有一个更好的模糊解决方案(如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模糊效果?所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1128046.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存