Chain 2 Renderscript Intrinsics:模糊和色彩矩阵

Posted

技术标签:

【中文标题】Chain 2 Renderscript Intrinsics:模糊和色彩矩阵【英文标题】:Chain 2 Renderscript Intrinsics : Blur & ColorMatrix 【发布时间】:2014-07-11 17:08:12 【问题描述】:

我正在尝试链接两个 Renderscript:ScriptIntrinsicBlur 和 ScriptIntrinsicColorMatrix。 我想模糊和图像,然后对其应用滤色器。

这是我当前的代码(我尝试了许多不同的实现,包括 ScriptGroups,但我无法开始工作:

final ScriptIntrinsicBlur scriptBlur = ScriptIntrinsicBlur.create(
        mRenderScript,
        Element.U8_4(mRenderScript));
final Allocation input = Allocation.createFromBitmap(mRenderScript,
        bmp);
Bitmap blurOutBitmap = bmp.copy(bmp.getConfig(), true);
final Allocation output = Allocation.createFromBitmap(
        mRenderScript, blurOutBitmap);

scriptBlur.setRadius(mBlur_Radius);
scriptBlur.setInput(input);
scriptBlur.forEach(output);
bmp.recycle();
output.copyTo(blurOutBitmap);

mRenderScript.finish();

final ScriptIntrinsicColorMatrix scriptColor = ScriptIntrinsicColorMatrix
        .create(mRenderScript, Element.U8_4(mRenderScript));

/** for a first test, I am using a simple blue filter **/
Matrix3f mat = new Matrix3f(new float[] 
        1, 0, 1,
        0, 1, 1,
        0, 0, 1
);
scriptColor.setColorMatrix(mat);

final Allocation colorInput = Allocation.createFromBitmap(mRenderScript,
        blurOutBitmap);
Bitmap outBitmap = bmp.copy(blurOutBitmap.getConfig(), true);
final Allocation colorOutput = Allocation.createFromBitmap(
        mRenderScript, outBitmap);

scriptColor.forEach(colorInput, colorOutput);
blurOutBitmap.recycle();
colorOutput.copyTo(outBitmap);
displayBitmap(outBitmap);

此代码会在图像上产生非常难看的伪影(平行的红线),如果我尝试使用 ScriptGroup,它只会崩溃。 有 Renderscript 经验的人可以帮我破译为什么吗?由于关于该主题的示例或文档很少,我只能尝试随机修改。

【问题讨论】:

你有没有试过在你的模糊内在运行后不调用bmp.recycle()?该调用将释放 Bitmap 对象后面的任何本机缓冲区,但稍后在为滤色器设置 outBitmap 时再次使用该对象。 @LarrySchiefer 嗯,我可能更明智地只在完成后回收。谢谢 !实际上,我刚刚找到了让这个小组工作的方法。看起来这个 ScriptGroup + Intrinsic 案例中有一个错误 【参考方案1】:

这是执行此操作的正确方法(或至少一种可行的方法,这种情况有点错误):

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.lenna);

ScriptIntrinsicBlur scriptBlur = ScriptIntrinsicBlur.create(mRenderScript, Element.U8_4(mRenderScript));
scriptBlur.setRadius(5f);

ScriptIntrinsicColorMatrix scriptColor = ScriptIntrinsicColorMatrix.create(mRenderScript, Element.U8_4(mRenderScript));

final Allocation input = Allocation.createFromBitmap(mRenderScript, bitmap,
        Allocation.MipmapControl.MIPMAP_NONE,
        Allocation.USAGE_SCRIPT | Allocation.USAGE_SHARED);
scriptBlur.setInput(input);
Bitmap outBitmap = bitmap.copy(bitmap.getConfig(), true);
final Allocation output = Allocation.createTyped(mRenderScript, input.getType());


scriptColor.setColorMatrix(new Matrix4f(
        new float[]1, 0f, 0f,   0,
                    1, 1,  0f,   0,
                    1, 0f, 1,    0,
                    0, 0,  0,    1
));


ScriptGroup.Builder b = new ScriptGroup.Builder(mRenderScript);
b.addKernel(scriptBlur.getKernelID());
b.addKernel(scriptColor.getKernelID());
b.addConnection(input.getType(), scriptBlur.getKernelID(), scriptColor.getKernelID());
ScriptGroup group = b.create();

// group.setInput(scriptBlur.getKernelID(),input);
group.setOutput(scriptColor.getKernelID(), output);


group.execute();
output.copyTo(outBitmap);
return outBitmap;

【讨论】:

以上是关于Chain 2 Renderscript Intrinsics:模糊和色彩矩阵的主要内容,如果未能解决你的问题,请参考以下文章

使用 Renderscript 启动选项裁剪图像数据

Android RenderScriptRenderScript 简介 ③ ( RenderScript 发布和运行 | RenderScript 脚本 )

RenderScript多输入参数

RenderScript Intrinsics 高斯模糊

RenderScript在Android 6上崩溃

为啥 Google 选择 RenderScript 而不是 OpenCL [关闭]