将通用分配与 ScriptIntrinsics 结合使用

Using generic Allocations with ScriptIntrinsics

我一直在尝试将 Renderscript ScriptIntrinsics 与从位图创建的通用分配 而非 一起使用,例如以下代码:

byte[] zeroedArray = new byte[bitmap.getWidth() * bitmap.getHeight()];
Allocation inputAllocation = Allocation.createSized(mRSContext,
                Element.U8(mRSContext),
                bitmap.getWidth() * bitmap.getHeight(),
                Allocation.USAGE_SCRIPT);
inputAllocation.copyFrom(zeroedArray);

final Allocation output = Allocation.createTyped(mRSContext, inputAllocation.getType());

ScriptIntrinsicBlur scriptBlur =
                ScriptIntrinsicBlur.create(mRSContext, Element.U8(mRSContext));

scriptBlur.setRadius(25f);
scriptBlur.setInput(inputAllocation);
scriptBlur.forEach(output);
output.copyTo(zeroedArray);

运行 此代码会使应用程序崩溃并引发异常:

10-01 02:47:59.601    8705-8726/com.example A/libc﹕ Fatal signal 11 (SIGSEGV), code 1, fault addr 0xa4892700 in tid 8726 (rsexample)
10-01 02:47:59.601    8705-8729/com.example A/libc﹕ Fatal signal 11 (SIGSEGV), code 1, fault addr 0xa4892700 in tid 8729 (rsexample)
10-01 02:47:59.601    8705-8727/com.example A/libc﹕ Fatal signal 11 (SIGSEGV), code 1, fault addr 0xa4892700 in tid 8727 (rsexample)
10-01 02:47:59.601    8705-8728/com.example A/libc﹕ Fatal signal 11 (SIGSEGV), code 1, fault addr 0xa4892700 in tid 8728 (rsexample)

但是,如果我像下面这样从位图创建分配,它就可以工作(在实例化脚本时也使用正确的元素类型):

inputAllocation = Allocation.createFromBitmap(mRSContext,
                bitmap,
                Allocation.MipmapControl.MIPMAP_NONE,
                Allocation.USAGE_SCRIPT);
(...)
ScriptIntrinsicBlur scriptBlur =
                ScriptIntrinsicBlur.create(mRSContext,
                        Element.U8_4(mRSContext));

阅读 documentation 我发现没有要求输入分配应该从位图创建。它只提到它应该是Element U8类型。我是否遗漏了一些使其与通用分配一起使用的东西,或者它是否打算仅与位图一起使用?

啊,我觉得这里有一个错误(明天上班我会在内部归档)。 Blur 需要 2D 输入,而您在上面仅创建了一个 1 维分配(使用 createSized())。我相信如果您创建一个 2D Allocation,它甚至可以用于非位图数据。