gpt4 book ai didi

android - 如何使用 renderscript 实时模糊位图?

转载 作者:行者123 更新时间:2023-11-29 20:47:59 25 4
gpt4 key购买 nike

我需要使用 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;
}

最佳答案

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

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

关于android - 如何使用 renderscript 实时模糊位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29918441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com