Renderscript-为什么参数类型在uchar4中?

时间:2019-05-25 18:27:33

标签: android types parameters renderscript

我看了这个示例https://github.com/googlesamples/android-BasicRenderScript。在该项目中,它们具有以下行:

mInAllocation = Allocation.createFromBitmap(rs, mBitmapIn);

其中mBitmapIn是位图类型,代表要处理的图像。 后来,他们通过AsyncTask异步在.rs文件中调用名为饱和的内核函数:

mScript.forEach_saturation(mInAllocation, mOutAllocations[index]);

在aturation.rs文件中,它们具有:

uchar4 __attribute__((kernel)) saturation(uchar4 in)
{
    float4 f4 = rsUnpackColor8888(in);
    ... 

通过该线程Renderscript, what is the `in` parameter?,我知道参数'in'指向要处理的数据(在我们的情况下是像素,对吗?),所以,我知道一个像素由4个颜色通道组成因此,他们使用 uchar4 ,它是4个uchar的向量(请参见https://developer.android.com/guide/topics/renderscript/reference/rs_value_types.html#android_rs:uchar4)。但是为什么 uchar ?为何说 uint4 ?或直接 ufloat4

1 个答案:

答案 0 :(得分:0)

渲染脚本是用C99标准定义的,并在此处列出类型的sizeof值:

https://developer.android.com/guide/topics/renderscript/reference/rs_value_types

因此,从该图表:

uchar具有8位无符号值大小

uint具有32位无符号值大小

浮点数为32位

通常配置Android位图 ARGB_8888格式,因此每个像素都有3个颜色通道以及由8位组成的alpha通道。

即使在您的示例中,您也可以看到出于计算目的而转换为浮点数的情况:

float4 f4 = rsUnpackColor8888(in);

有关C类型大小的更全面讨论,请参见:Is the size of C “int” 2 bytes or 4 bytes?