如何自定义renderscript root函数使用的参数?

时间:2013-01-19 23:08:27

标签: android image-processing image-rotation renderscript

背景

我是renderscript的新手,我想用它做一些实验(但是小的,而不是我们在SDK中找到的复杂的实验),所以我想到了一个试验的练习,这是基于a previous question of mine(使用NDK)。

我想做什么

简而言之,我想将位图数据传递给renderscript,然后我希望它将数据复制到另一个与前一个相反的位图,这样第二个位图就会旋转第一个。

举例说明: 从这个位图(宽度:2,高度:4):

01
23 
45
67

我希望它旋转(逆时针90度)到:

1357
0246

问题

我注意到当我尝试更改root函数的签名时,Eclipse会给我带来错误。

即使制作新功能也会产生新的错误。我甚至尝试过在谷歌博客(here上编写的相同代码,但是我无法找到他如何创建他使用的函数,为什么我不能改变过滤器函数来使用输入和输出位图数组。

我可以做些什么来自定义我发送给renderscript的参数,并使用其中的数据?

是否可以不使用“过滤器”或“根”功能(API 11及更高版本)?我能做些什么才能更灵活地在那里做什么?

1 个答案:

答案 0 :(得分:1)

你在这里问了一堆单独的问题,所以我会按顺序回答。 1)您想要旋转非方形位图。不幸的是,Renderscript的位图模型不允许您轻松地执行此操作。这样做的原因是输入和输出分配必须具有相同的形状(即,相同数量的维度和那些维度的值,即使类型不同)。为了获得您想要的效果,您应该使用仅具有新形状的输出分配的根函数(即输入列X输入行)。您可以创建一个rs_allocation全局变量来保存输入位图(然后可以在Java端创建/绑定)。然后内核只需要将输出单元格设置为rsGetElementAt(globalInAlloc,y,x)的结果。

2)如果您使用的是API 11,则无法调整root()函数的签名(您可以将NULL分配作为输入传递,如果不使用它们则在Java端输出)。您也无法在这些较旧的API级别上为每个源文件创建多个内核,因此您只能使用一个“root()”函数。如果您想为每个源文件使用更多内核,请考虑定位更高的API级别。