我一直在尝试使用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读取我发现不要求从位图创建输入分配。它只提到它应该是元素U8类型。我是否遗漏了某些内容以使其适用于通用分配,或者它是否仅适用于位图?
答案 0 :(得分:2)
啊,我认为这里有一个错误(明天我会在内部提交它)。模糊期望2D输入,并且您仅在上面创建了一维分配(使用createSized())。我相信如果你创建一个2D分配,它甚至可以用于非Bitmap数据。