我有一个采用位图和颜色的方法,并将位图上的所有像素转换为该颜色,同时保留原始的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};
整个Bitmap应该完全透明。但是,如果原始位图根本没有透明度,这只能正常工作。如果位图的所有像素的alpha值都只有255,则结果完全透明。但是,如果位图具有alpha值小于255的任何像素,则最终图像将不是透明的,但将具有与原始图像相同的alpha值。
任何人都可以说出原因吗?
提前致谢。
答案 0 :(得分:0)
默认情况下,位图具有黑色背景。将位图的背景设置为透明可以解决问题。
这可以通过在声明resultBitmap.eraseColor(Color.argb(0, 0, 0, 0));
后添加resultBitmap
来完成,将canvas.drawBitmap(resultBitmap, 0, 0, paint);
更改为canvas.drawBitmap(img, 0, 0, paint);
。