有很多地方(包括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模糊效果?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)