Renderscript 从分配中获取 RGB - Android

Renderscript get RGB from allocation - Android

我目前从这样的分配对象中读取 rgb 像素:

float4 elementF4TL = rsUnpackColor8888(*(uchar*)rsGetElementAt(inPixels, x-1, y-1));
uchar4 pixelCharsTL = rsPackColorTo8888(elementF4TL);
float3 pixelTL = convert_float4(pixelCharsTL).rgb;

然后我得到 pixelTL.rgb 即 returns 我想要的 RGB 值。 有更优雅的方法吗?

例如,rsUnpackColor8888接受一个uchar4作为参数。如果我传递一个从 rsGetElementAt_uchar4(...) 设置的变量 returns a uchar4 它会中断。

我不是 100% 理解这行的意思:*(uchar*)rsGetElementAt(inPixel....

您似乎做了很多不必要的转换和转换。例如,您解包 8888 颜色表示只是为了在下一行再次打包它。

假设 inPixels 是 uchar 类型图像的 rs_allocation 对象,您可以使用正常的 rsGetElementAt_*(...) 函数。您也许可以这样做:

float3 pixelTL = convert_float4(rsGetElementAt_uchar4(inPixels, x-1, y-1)).rgb;

这个函数会在allocation中的位置(x-1, y-1)提取一个uchar4向量,将其转换为float4然后.rgb后缀只抓取第一个这些元素中的 3 个组成 float3 并分配给您的变量。


并且只是为了回答您关于 *(uchar*)... 的原始问题:

通常,您会为函数调用使用特定类型,例如 rsGetElementAt_uchar4(...),然后 returns 指定的实际 uchar4 向量。

但是,如果您只调用泛型 rsGetElementAt(...),它 returns 一个指向第一个元素的空指针 -- void*。因此,您必须将该指针转换为您需要的数据类型,即该片段中的 (uchar*)rsGetElementAt(...),然后您必须取消引用它以获取该指针所在位置的实际值,*(uchar*)rsGetElementAt(...)。但是,是的,如上所示,可以更简单地完成很多来回。