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*(). Если вам нужно автоматическое поведение при сжатии / переносе, вы также можете проверить API rs_sampler и rsSample ().