0

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

谁能告诉我为什么?

提前致谢。

4

1 回答 1

0

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

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

于 2012-10-07T22:55:22.377 回答