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

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

@H_262_9@@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(); } }

问题

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

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

我试过的

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

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

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

这个问题

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

解决方法

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

@H_262_9@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,请注明来意。