Renderscript从分配中获取RGB - Android

时间:2015-06-17 09:15:56

标签: android renderscript

我目前从分配对象中读取rgb像素,如下所示:

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

然后我得到了像我们想要的RGB值的pixelTL.rgb。 有更优雅的方式吗?

例如,rsUnpackColor8888uchar4作为参数。如果我传递一个从rsGetElementAt_uchar4(...)设置并返回uchar4的变量,则会中断。

我不完全理解这一行的含义:*(uchar*)rsGetElementAt(inPixel....

1 个答案:

答案 0 :(得分:3)

您似乎正在进行大量不必要的转换和投射。例如,您只需解压缩8888颜色表示,然后再将其打包到下一行。

假设inPixels是uchar类型图像的rs_allocation对象,则可以使用普通的rsGetElementAt_*(...)函数。你可以做这样的事情:

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

此函数将在分配中的位置(x-1,y-1)处提取uchar4向量,将其转换为float4,然后.rgb后缀仅抓取前3个要使float3分配给您的变量的那些元素。

回答关于*(uchar*)...的原始问题:

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

但是,如果只调用泛型rsGetElementAt(...),它会向第一个元素返回一个void指针 - void*。因此,您必须将该指针强制转换为所需的数据类型{@ 1}},然后您必须取消引用它以获取该指针位置{,1}}的实际值。但是,如上所示,可以更加简单地来回做很多事情。