2013-07-01 61 views
1

我开始探索renderscript的力量。Renderscript - 获取邻居像素

尝试2D图像数据,我可以将像素转换为其他像素。 但是,如何从输入分配中获取相邻像素?

我是如何做内置的convolve3x3过滤器,当它需要相邻像素操作,它很好地钳位图像边缘的像素。

假设我有功能

void root(const uchar4 *v_in, uchar4 *v_out) { 
    float4 f4 = rsUnpackColor8888(*v_in); 
    // do something on pixel 
    uchar4 u4 = rsPackColorTo8888(f4); 
    *v_out = u4; 
} 

我真的应该索引V_IN像V_IN [1]或V_IN [K],以获得其它的像素,或者是有一些巧妙RS *函数来获取相邻的水平/垂直像素,同时提供适当的图像大小钳位,这样我就不会索引v_in阵列的大小?

回答

1

如果您想查看相邻像素(并且您正在使用rs_allocations),则应该只使用一个全局rs_allocation而不是将其作为* v_in传递。这看起来像:

rs_allocation in; 

// Using the new kernel syntax where v_out becomes the return value. 
uchar4 __attribute__((kernel)) doSomething(uint32_t x, uint32_t y) { 
    uchar4 u4 = rsGetElementAt_uchar4(in, x, y); // You can adjust x,y here to get neighbor values too. 
    float4 f4 = rsUnpackColor8888(u4); 
    ... 
    return rsPackColorTo8888(f4); 
} 

不幸的是,有没有好的办法让一个普通rs_allocation自动夹紧,但你可以调整你的代码做手工边缘夹。保持将maxX,maxY作为全局变量传递给脚本,然后在任何rsGetElementAt *()之前动态检查您是否在范围内。如果您确实需要自动夹紧/包装行为,则还可以检出rs_sampler和rsSample()API。

+0

嗯,但是我得到SDK Tools 22.0.1的错误:SDK级别11-15中不支持非根计算内核doSomething()。 这是一些新的尚未发布的API吗? –

+0

哦,我只是用内核的新语法(可以传递值)而不是指针的东西。如果你喜欢,你可以转换我写的代码来使用输出指针(* v_out)。 –

+0

好的,仍然是所有的混淆,RS语法的各种版本等,我会等待官方的RS API 18或它叫什么,然后再试一次。谢谢。 –