1

Я работаю с простым скриптом в RenderScript. Мне нужно изменить значения RGBA на пиксель из растрового изображения. После многих попыток я обнаружил, что альфа-канал не изменяется.RenderScript не изменяет альфа-канал? [Android]

Я провел несколько исследований, и я нашел this old question, но я не понимаю, как и почему это происходит. Правильно ли вы используете modiphy Alpha-канал в скрипте?

Вот усеченную версию моего кода:

Java сторона:

Allocation img= Allocation.createFromBitmap(encodeRS, bmp,Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); 

Renderscript сторона:

uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) { 

    uchar r= (in.r) & 0xFC; 
    uchar g= (in.g) & 0xFC; 
    uchar b= (in.b) & 0xFC; 
    uchar a= (in.a) & 0xFC; 

    return (uchar4) {r,g,b,a}; 

} 

Я также попытался с привязкой памяти, но результат тот же:

void root(uchar4* in, uint32_t x, uint32_t y) { 

    uchar r= (in->r) & 0xFC; 
    uchar g= (in->g) & 0xFC; 
    uchar b= (in->b) & 0xFC; 
    uchar a= (in->a) & 0xFC; 

    in->r= r; 
    in->g= g; 
    in->b= b; 
    in->a= a; 

} 

Затем я делаю copyTo со стороны java (после forEach), но альфа-канал устанавливается автоматически на 255.

img.copyTo(bmp); 

В любом случае, спасибо за поддержку.

- Update 1:

Я забыл упомянуть, что я получаю Bitmap из файла с getAbsolutePath(), как это:

Bitmap bmp= BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 

ответ

2

Не знаю, как ваш вклад Bitmap ВМР был первоначально определен, но для того, чтобы гарантировать, что выходной Bitmap имеет изменяемый альфа-канал, я бы определил его явно, как:

Bitmap outBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
Allocation img= Allocation.createFromBitmap(rs, outBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); 

, а затем в конце:

img.copyTo(outBitmap); 
+0

Вы хотите | Allocation.USAGE_SHARED, так как это уменьшит количество копий на большинстве растровых изображений. –

+0

Благодаря обоим. Я получаю битмап из пути из SDCARD, например: Bitmap bmp = BitmapFactory.decodeFile (imgFile.getAbsolutePath()); Я проверю с помощью общего растрового изображения, созданного с помощью ARGB_8888, если это вызывает проблему. – gabrielication