我看了这个示例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 ?
答案 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?