我开始探索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数组的大小?
答案 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。