Renderscript - почему тип параметра "in" - это uchar4? - PullRequest
0 голосов
/ 25 мая 2019

Я посмотрел на этот пример https://github.com/googlesamples/android-BasicRenderScript. В этом проекте у них есть следующая строка:

mInAllocation = Allocation.createFromBitmap(rs, mBitmapIn);

, где mBitmapIn имеет тип Bitmap, представляющий изображение для обработки.Позже они асинхронно вызывают функцию ядра с именем saturation в файле .rs через AsyncTask:

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

В файле saturation.rs они имеют:

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

Из этого потока Renderscript, что такое параметр `in`? Я знаю, что параметр 'in' указывает на данные, которые нужно обработать (в нашем случае это пиксель, верно?) Итак, я знаю, что пиксель состоитиз 4 цветовых каналов, и поэтому они используют uchar4 , который является вектором 4 учаров (см. https://developer.android.com/guide/topics/renderscript/reference/rs_value_types.html#android_rs:uchar4).Но почему учар ?Почему бы, скажем, не uint4 ?Или прямо уфлоат4 ??

1 Ответ

0 голосов
/ 25 мая 2019

Renderscript определяется стандартом C99 и перечисляет значения sizeof для типов здесь:

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

Итак, из этого графика:

uchar имеет8-битный размер без знака

У uint есть 32-битный размер без знака

с плавающей точкой имеет 32-битный размер

Битовые карты Android обычно настраиваются в формате ARGB_8888 , поэтомукаждый пиксель имеет 3 цветовых канала наряду с альфа-каналом и те, которые состоят из 8 битов.

Даже в вашем примере вы можете увидеть преобразование в числа с плавающей запятой для вычислительных целей:

float4 f4 = rsUnpackColor8888(in);

Для болееподробное обсуждение размеров типа C см. Является ли размер C «int» 2 байтами или 4 байтами?

...