ColorMatrixColorFilter不会影响小于255的alpha值

时间:2012-10-07 20:19:52

标签: android colormatrix colorfilter

我有一个采用位图和颜色的方法,并将位图上的所有像素转换为该颜色,同时保留原始的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值。

任何人都可以说出原因吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

默认情况下,位图具有黑色背景。将位图的背景设置为透明可以解决问题。

这可以通过在声明resultBitmap.eraseColor(Color.argb(0, 0, 0, 0));后添加resultBitmap来完成,将canvas.drawBitmap(resultBitmap, 0, 0, paint);更改为canvas.drawBitmap(img, 0, 0, paint);