0

我有十六进制 rgb 颜色和黑白蒙版。这是两个整数数组:

mColors = new int[] {
                 0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
                 0xFFFFFF00, 0xFFFF0000
             };
mColorsMask = new int[] {
                     0xFFFFFFFF, 0xFF000000, 0xFFFFFFFF, 0xFF000000, 0xFFFFFFFF,
                     0xFFFFFFFF, 0xFF000000
                 };

我需要根据对比度将颜色转换为黑色值。对比度是 0 到 255 范围内的整数值: 在此处输入图像描述

白色一切都很好,我做了字节加法:

int newHexColor = (contrast << 16) | (contrast << 8) | contrast | mColors[i];
newColorsArray[i] = mode;

如何将其转换为黑色?

4

2 回答 2

0

您可以使用对比度使图像变成黑白。

看代码..

public static Bitmap createContrast(Bitmap src, double value) {
    // image size
    int width = src.getWidth();
    int height = src.getHeight();
    // create output bitmap
    Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
    // color information
    int A, R, G, B;
    int pixel;
    // get contrast value
    double contrast = Math.pow((100 + value) / 100, 2);

    // scan through all pixels
    for(int x = 0; x < width; ++x) {
        for(int y = 0; y < height; ++y) {
            // get pixel color
            pixel = src.getPixel(x, y);
            A = Color.alpha(pixel);
            // apply filter contrast for every channel R, G, B
            R = Color.red(pixel);
            R = (int)(((((R / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
            if(R < 0) { R = 0; }
            else if(R > 255) { R = 255; }

            G = Color.red(pixel);
            G = (int)(((((G / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
            if(G < 0) { G = 0; }
            else if(G > 255) { G = 255; }

            B = Color.red(pixel);
            B = (int)(((((B / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
            if(B < 0) { B = 0; }
            else if(B > 255) { B = 255; }

            // set new pixel color to output bitmap
            bmOut.setPixel(x, y, Color.argb(A, R, G, B));
        }
    }

    return bmOut;
 }

在方法调用时将双精度值设置为 50。例如createContrast(Bitmap src, 50)

于 2012-11-24T20:49:18.767 回答
0

您可能会考虑使用 HSB 颜色空间。它似乎更适合您尝试做的事情。特别是,您在“我想要什么”图像中看到那些最终变成黑色的角度?这些对应于 60、180 和 300 度的“色调”(Java 中的 1.0/6、3.0/6 和 5.0/6)。白色对应于 0、120 和 240 度(Java 中的 0、1.0/3 和 2.0/3)——并非巧合的是,这些角度的颜色是原色(也就是说,三个 RGB 分量中的两个是零)。

你要做的是找到你的颜色的色调和最接近的原色之间的差异。(应该小于 1/6。)按比例放大(乘以 6 就可以了),给你一个介于 0 和 1.0 之间的值。这会给你一个“杂质”值,它基本上是与最接近的原色的偏差。当然,从 1.0 中减去的数字会给你“纯度”,或者接近原色。

您可以使用 R、G 和 B 的相应值,alpha 为 1.0f,根据杂质或纯度创建灰度颜色。

public Color getMaskColor(Color c) {
    float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null);
    float hue = hsv[0];

    // 0, 1/3, and 2/3 are the primary colors.  Find the closest one to c,
    // by rounding c to the nearest third.
    float nearestPrimaryHue = Math.round(hue * 3.0f) / 3.0f;

    // difference between hue and nearestPrimaryHue <= 1/6
    // Multiply by 6 to get a value between 0 and 1.0
    float impurity = Math.abs(hue - nearestPrimaryHue) * 6.0f;
    float purity = 1.0f - impurity;

    // return a greyscale color based on the "purity"
    // (for #FF0000, would return white)
    // using impurity would return black instead
    return new Color(purity, purity, purity, 1.0f);
}

您可以使用返回颜色的颜色分量作为“对比度”值,也可以更改函数以使其根据需要返回“纯度”或“杂质”。

请注意,灰度颜色的数学变得不稳定。(Java 计算 HSB 的方式,纯灰色只是没有色调(饱和度 = 0)的红色(色调 = 0)。唯一改变的组件是亮度。)但是因为你的色轮没有灰度颜色......

于 2012-11-25T03:23:40.627 回答