元のアルファ値を維持しながら、ビットマップと色を取得し、ビットマップ上のすべてのピクセルをその色に変換するメソッドがあります。さらに、このメソッドは、渡された色が暗くなるにつれて、ビットマップが暗くなるのではなく、より透明になるように記述されています。渡された色が完全に黒の場合、ビットマップは黒ではなく完全に透明にする必要があります。
public static Bitmap colorImage(Bitmap img, int red, int green, int blue) {
int max = blue;
if (red >= green && red >= blue)
max = red;
else if (green >= red && green >= blue)
max = green;
double scale = 255.0 / max;
red = (int)(scale * red);
green = (int)(scale * green);
blue = (int)(scale * blue);
Bitmap resultBitmap = img.copy(Bitmap.Config.ARGB_8888, true);
float[] colorTransform = {
0, 0, 0, 0, red,
0, 0, 0, 0, green,
0, 0, 0, 0, blue,
0, 0, 0, (float) (1f / scale), 0};
ColorMatrix colorMatrix = new ColorMatrix(colorTransform);
ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
Paint paint = new Paint();
paint.setColorFilter(colorFilter);
Canvas canvas = new Canvas(resultBitmap);
canvas.drawBitmap(resultBitmap, 0, 0, paint);
return resultBitmap;
}
ビットマップを透明にする際に問題があります。
次のようになるようにカラーマトリックスを設定すると、
float[] colorTransform = {
0, 0, 0, 0, red,
0, 0, 0, 0, green,
0, 0, 0, 0, blue,
0, 0, 0, 0, 0};
ビットマップ全体を完全に透明にする必要があります。ただし、これは元のビットマップに透明度がまったくない場合にのみ正しく機能します。Bitmap のすべてのピクセルのアルファ値が 255 しかない場合、結果は完全に透明になります。ただし、ビットマップに 255 未満のアルファ値を持つピクセルがある場合、最終的なイメージは透明にはなりませんが、元のイメージと同じアルファ値になります。
誰でも理由がわかりますか?
前もって感謝します。