我目前从分配对象中读取rgb像素,如下所示:
float4 elementF4TL = rsUnpackColor8888(*(uchar*)rsGetElementAt(inPixels, x-1, y-1));
uchar4 pixelCharsTL = rsPackColorTo8888(elementF4TL);
float3 pixelTL = convert_float4(pixelCharsTL).rgb;
然后我得到了像我们想要的RGB值的pixelTL.rgb。 有更优雅的方式吗?
例如,rsUnpackColor8888
将uchar4
作为参数。如果我传递一个从rsGetElementAt_uchar4(...)
设置并返回uchar4
的变量,则会中断。
我不完全理解这一行的含义:*(uchar*)rsGetElementAt(inPixel....
答案 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}}的实际值。但是,如上所示,可以更加简单地来回做很多事情。