【问题标题】:Blur a bitmap with Renderscript and more than 25 radius Android使用 Renderscript 和超过 25 个半径的 Android 模糊位图
【发布时间】:2016-05-05 10:41:02
【问题描述】:

我用 Androids Rederscript 模糊了位图

private Bitmap createBitmap_ScriptIntrinsicBlur(Bitmap src, float r) {

    //Radius range (0 < r <= 25)
    if(r <= 0){
        r = 0.1f;
    }else if(r > 25){
        r = 25.0f;
    }
    Bitmap bitmap = Bitmap.createBitmap(src.getWidth(), src.getHeight(),Bitmap.Config.ARGB_8888);

    RenderScript renderScript = RenderScript.create(getActivity());

    Allocation blurInput = Allocation.createFromBitmap(renderScript, src);
    Allocation blurOutput = Allocation.createFromBitmap(renderScript, bitmap);

    ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(renderScript,Element.U8_4(renderScript));
    blur.setInput(blurInput);
    blur.setRadius(r);
    blur.forEach(blurOutput);

    blurOutput.copyTo(bitmap);
    renderScript.destroy();
    return bitmap;
}

但图像不够模糊。 是否有可能模糊半径超过 25 的图像。 当我多次调用模糊函数时,图像保持与单个函数调用一样模糊。所以这也不起作用。
谢谢您的帮助。

【问题讨论】:

  • 如果您在修改后的位图上再次调用它,它会做什么?
  • 有点奇怪,当我这样做时:Bitmap bitmap = ....my Bitmap; imageView.setImageBitmap(createRenderScriptBlur(createRenderScriptBlur(bitmap,25),25));就像一个电话一样运作。但是当我这样做时: Bitmap a =...myBitmap Bitmap b = createRenderScriptBlur(a,25);位图 c = createRenderScriptBlur(b,25); imageView.setImageBitmap(c);它有效。
  • 是的,我想说更像位图 a = blur(mybitmap, 25); a = 模糊(a, 25);

标签: android bitmap blur renderscript


【解决方案1】:
  1. 将图像缩小 4-8 倍。
  2. 以 25 像素半径运行模糊。
  3. 缩小到原始大小。

【讨论】:

    【解决方案2】:

    我知道你说过多次运行它是行不通的,但这就是我正在做的事情。

    Bitmap inputBitmap = Bitmap.createScaledBitmap(artistImage, artistImage.getWidth(), artistImage.getHeight(), false);
    Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);
    
    RenderScript rs = RenderScript.create(context);
    
    for (int i = 0; i < 10; i++){
        final Allocation input = Allocation.createFromBitmap(rs, outputBitmap); //use this constructor for best performance, because it uses USAGE_SHARED mode which reuses memory
        final Allocation output = Allocation.createTyped(rs, input.getType());
        final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
    
        script.setRadius(25F);
        script.setInput(input);
        script.forEach(output);
        output.copyTo(outputBitmap);
    }
    

    您可能已经多次在正常源图像上运行模糊,这显然不会完成任何事情。这对我有用,并且可以根据 i 的含义模糊它。

    【讨论】:

    • 这种方法效果很好。如果性能很重要,只需将 ScriptIntrinsicBlur script = ScriptIntrinsicBlur.createscript.setRadius(25f); 移出范围即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多