【问题标题】:ColorMatrixColorFilter does not affect alpha values less than 255ColorMatrixColorFilter 不影响小于 255 的 alpha 值
【发布时间】:2012-10-08 06:55:22
【问题描述】:

我有一个采用位图和颜色的方法,并将位图上的所有像素转换为该颜色,同时保持原始的 alpha 值。此外,该方法被编写为随着传入的颜色变暗,Bitmap 变得更透明而不是更暗。如果传入的颜色是全黑的,那么 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 值。

谁能说出原因?

提前致谢。

【问题讨论】:

    标签: android colormatrix colorfilter


    【解决方案1】:

    位图默认有黑色背景。将位图的背景设置为透明可以解决此问题。

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

    【讨论】:

      猜你喜欢
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 2017-06-29
      • 1970-01-01
      • 2013-06-03
      • 2017-05-07
      • 1970-01-01
      相关资源
      最近更新 更多