如何使用具有多个输入分配的RenderScript?

时间:2013-12-26 11:13:48

标签: android renderscript

最近,我发现渲染脚本是Android上图像处理的更好选择。表演很精彩。但是关于它的文件并不多。我想知道我是否可以通过渲染脚本将多张照片合并到结果照片中。

http://developer.android.com/guide/topics/renderscript/compute.html说:

  

内核可能有输入Allocation,输出Allocation或两者。内核可能没有多个输入或一个输出Allocation。如果需要多个输入或输出,则应将这些对象绑定到rs_allocation脚本全局变量,并通过rsGetElementAt_type()rsSetElementAt_type()从内核或可调用函数访问。

此问题是否有任何代码示例?

3 个答案:

答案 0 :(得分:3)

对于具有多个输入的内核,您必须手动处理其他输入。

假设您想要2个输入。

example.rs:

rs_allocation extra_alloc;

uchar4 __attribute__((kernel)) kernel(uchar4 i1, uint32_t x, uint32_t y)
{
    // Manually getting current element from the extra input
    uchar4 i2 = rsGetElementAt_uchar4(extra_alloc, x, y);
    // Now process i1 and i2 and generate out
    uchar4 out = ...;
    return out;
}

爪哇:

Bitmap bitmapIn = ...;
Bitmap bitmapInExtra = ...;
Bitmap bitmapOut = Bitmap.createBitmap(bitmapIn.getWidth(),
                    bitmapIn.getHeight(), bitmapIn.getConfig());

RenderScript rs = RenderScript.create(this);
ScriptC_example script = new ScriptC_example(rs);

Allocation inAllocation = Allocation.createFromBitmap(rs, bitmapIn);
Allocation inAllocationExtra = Allocation.createFromBitmap(rs, bitmapInExtra);
Allocation outAllocation = Allocation.createFromBitmap(rs, bitmapOut);

// Execute this kernel on two inputs
script.set_extra_alloc(inAllocationExtra);
script.forEach_kernel(inAllocation, outAllocation);

// Get the data back into bitmap
outAllocation.copyTo(bitmapOut);

答案 1 :(得分:2)

你想做点什么

rs_allocation input1;
rs_allocation input2;

uchar4 __attribute__((kernel)) kernel() {
  ... // body of kernel goes here
  uchar4 out = ...;
  return out;
}

从Java代码中调用set_input1set_input2以将其设置为相应的分配,然后使用输出分配调用forEach_kernel

答案 2 :(得分:0)

您就是这样做的:

<。>在.rs文件中:

uchar4 RS_KERNEL myKernel(float4 in1, int in2, uint32_t x, uint32_t y)
{
    //My code
}

在java中:

myScript.forEach_myKernel(allocationInput1, allocationInput2, allocationOutput);

使用uchar4,float4和int作为示例。它适用于我,你可以添加2个以上的输入。