如何用renderscript生活模糊位图?

时间:2015-04-28 11:40:07

标签: android renderscript

我需要使用SeekBar来模糊图像,以便用户控制模糊的半径。我在下面使用这种方法,但是由于在SeekBar值改变时每个函数调用创建新的位图,它似乎浪费了内存和时间。使用RenderScript实现实时模糊的最佳方法是什么?

 public static Bitmap blur(Context ctx, Bitmap image, float blurRadius) {
    int width = Math.round(image.getWidth() * BITMAP_SCALE);
    int height = Math.round(image.getHeight() * BITMAP_SCALE);        
    Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false);          
    Bitmap outputBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
    RenderScript rs = RenderScript.create(ctx);
    ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs,  Element.U8_4(rs));
    Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
    Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
    theIntrinsic.setRadius(blurRadius);
    theIntrinsic.setInput(tmpIn);
    theIntrinsic.forEach(tmpOut);
    tmpOut.copyTo(outputBitmap);
    rs.destroy();
    if(inputBitmap!=outputBitmap)
        inputBitmap.recycle();
    return outputBitmap;
}

1 个答案:

答案 0 :(得分:2)

这些调用可能非常昂贵,而且应该在应用程序的外部完成。然后,您可以在需要时重用RenderScript上下文/对象和ScriptIntrinsicBlur。当函数完成时你也不应该销毁它们(因为你将重用它们)。为了节省更多成本,您可以将实际的输入/输出位图传递给您的例程(或其分配),并保持这些位置稳定。在这个片段中确实有很多动态创建/破坏,我可以想象其中一些事情不会经常变化(因此不需要从头开始重新创建)。

...
RenderScript rs = RenderScript.create(ctx);
ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs,  Element.U8_4(rs));
...