我有一个采用位图和颜色的方法,并将位图上的所有像素转换为该颜色,同时保持原始的 alpha 值。此外,该方法被编写为随着传入的颜色变暗,Bitmap 变得更透明而不是更暗。如果传入的颜色是完全黑色的,那么位图应该完全透明而不是黑色。
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};
整个位图应该完全透明。但是,这只有在原始位图根本没有透明度时才能正常工作。如果位图的所有像素只有 255 的 alpha 值,则结果是完全透明的。但是,如果位图有任何 alpha 值小于 255 的像素,则最终图像将不是透明的,但将具有与原始图像相同的 alpha 值。
谁能告诉我为什么?
提前致谢。