将通用分配与 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,它甚至可以用于非位图数据。
我一直在尝试将 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,它甚至可以用于非位图数据。