Renderscript - 获取邻居像素

时间:2013-07-01 07:21:20

标签: android 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 [1]或v_in [k]那样索引v_in来获取其他像素,或者是否有一些聪明的rs *函数来获取相邻的水平/垂直像素,同时提供适当的图像大小钳位,所以我没有索引v_in数组的大小?

1 个答案:

答案 0 :(得分: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。