1

私は RenderScript で簡単なスクリプトを使用しています。ビットマップからピクセルの RGBA 値を変更する必要があります。何度も試した結果、アルファ チャネルが変更されないことがわかりました。

いくつかの調査を行ったところ、この古い質問が見つかりましたが、これがどのように、なぜ起こるのかわかりません。スクリプトでアルファ チャネルを変更する正しい方法はありますか?

これが私のコードの簡素化されたバージョンです:

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;

}

次に、Java 側から (forEach の後) copyTo を実行しますが、アルファ チャネルは自動的に 255 に設定されます。

img.copyTo(bmp);

とにかくサポートに感謝します。

- 更新 1:

次のように getAbsolutePath() を使用してファイルからビットマップを取得することを忘れていました。

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

1 に答える 1

2

入力ビットマップ bmp が最初にどのように定義されたかはわかりませんが、出力ビットマップに編集可能なアルファ チャネルがあることを確認するために、次のように明示的に定義します。

 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);
于 2016-04-29T21:27:25.700 に答える