Сделать счетчик для прозрачных пикселей из растрового изображения в Renderscript - PullRequest
0 голосов
/ 01 января 2019

Моя проблема состоит в том, чтобы получить количество прозрачных частей / пикселей в изображении, которое изменяется из-за OnTouchEvent пользователем.

Поэтому я хотел бы преобразовать следующий код Java в код рендеринга:

public int transparentPixels(){  

    int amount = 0;

    for(int x = 0; x < sourceBitmap.getWidth(); x++){
        for(int y = 0; y < sourceBitmap.getHeight(); y++){

            if(sourceBitmap.getPixel(x,y) == Color.TRANSPARENT){

                amount += 1;

            }

        }
    }

    return amount;
}

Пожалуйста, добавьте фрагменты кода из файла rs и java.

Заранее спасибо!

1 Ответ

0 голосов
/ 09 января 2019

Ссылка: Документы RenderScript и rsAtomicInc .

Вот мой пример кода.Обратитесь к winklerrr решению здесь .

RSexample.rs

используйте in-> a для получения альфы ипроверьте его значение.

#pragma version(1)
#pragma rs java_package_name(RS)
#pragma rs_fp_relaxed

int32_t count = 0;
rs_allocation rsAllocationCount;

void countPixels(uchar4* in, uint x, uint y) {
  if(in->a==0)rsAtomicInc(&count);
  rsSetElementAt_int(rsAllocationCount, count, 0);
}

RSContext.java

действует как контекст между MainActivity.java и RSexample.rs.

public void init(Context context) {
    rs = RenderScript.create(context);
    scriptC_RS = new ScriptC_RSexample(rs);
}
public void setup(int w, int h){
    rgb888Type = Type.createXY(rs, Element.RGBA_8888(rs), w, h);
    allocIn = Allocation.createTyped(rs, rgb888Type, Allocation.USAGE_SCRIPT);
    allocCount = Allocation.createTyped(rs, Type.createX(rs, Element.I32(rs), 1));
}
public void addPic(Bitmap bitmap) {
    allocIn = Allocation.createFromBitmap(rs, bitmap);
}
public int getCount(){
    scriptC_RS.set_rsAllocationCount(allocCount);
    scriptC_RS.forEach_countPixels(allocIn);
    int[] count = new int[1];
    allocIn.syncAll(Allocation.USAGE_SCRIPT);
    allocCount.copyTo(count);
    return count[0];
}

MainActivity.java

RSContext rsContext = new RSContext();
rsContext.init(this);
rsContext.setup(bitmap.getWidth(), bitmap.getHeight());
rsContext.addPic(bitmap);
int transparentPixel = rsContext.getCount();
...