在ScriptIntrinsics

时间:2015-10-01 06:09:01

标签: android renderscript

我一直在尝试使用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类型。我是否遗漏了某些内容以使其适用于通用分配,或者它是否仅适用于位图?

1 个答案:

答案 0 :(得分:2)

啊,我认为这里有一个错误(明天我会在内部提交它)。模糊期望2D输入,并且您仅在上面创建了一维分配(使用createSized())。我相信如果你创建一个2D分配,它甚至可以用于非Bitmap数据。