В настоящее время я работаю в приложении для Android, где мне нужно вычислить среднее значение красного канала в растровом изображении, и я только что обнаружил Renderscript, который имеет быстрый способ доступа к пикселям растрового изображения. Однако до сих пор я изменял код страницы разработчика Google и не мог сделать то, что хотел, и вот мой код:
Сценарий:
int *sum;
uchar4 __attribute__ ((kernel)) invert(uchar4 in, uint32_t x, uint32_t y){
uchar4 out = in;
sum[0] += in.r;
out.r = 255 - in.r;
out.g = 255 - in.g;
out.b = 255 - in.b;
return out;
}
Итак, то, что я пытаюсь сделать выше, - это суммировать все красные значения в указателе «сумма» и в коде Java:
int [] sum = new int[2];
Allocation data = Allocation.createSized(rs, Elelement.I32(rs), sum.length, Allocation.USAGE_SCRIPT);
data.copy1DRangeFrom(0, sum.length, sum);
Bitmap output = Bitmap.createBitmap(input.getWith(), input.getHeight(), input.getConfig);
Allocation in = Allocation.createFromBitmap(rs, input);
Allocation out = Allocation.createFromBitmap(rs, output);
ScriptC_root root = new ScriptC_root(rs);
root.bind_sum(sum);
root.forEach_invert(in, out);
out.copyTo(output);
data.copyTo(sum); //Here is where i am trying to geck the sum
//so i try to compute the average
float avg = sum[0] / input.getWidth() * input.getHeight();
Для операции инвертирования растрового изображения я получаю в точности ожидаемый результат
Значение, которое я получаю в среднем, слишком мало (менее 150), в то время как входное растровое изображение представляет собой полностью красное изображение.
Я попытался просто увеличить указатель * sum в скрипте, чтобы проверить, обращается ли цикл foEach к одному и тому же количеству пикселей каждый раз, и при каждом запуске я получаю разные числа.
Помощь о том, как это сделать правильно, будет очень кстати.