0

私は16進RGBカラーと白黒マスクを持っています。これは2つの整数配列です。

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;
 }

メソッド呼び出しでdouble値を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) に対応します。偶然ではありませんが、これらの角度の色は原色です (つまり、3 つの RGB コンポーネントのうちの 2 つがゼロ)。

あなたがすることは、あなたの色の色相と最も近い原色との違いを見つけることです. (1/6 未満である必要があります。) 0 から 1.0 の間の値を得るために、スケールアップします (6 を掛ける必要があります)。これにより、基本的に最も近い原色からの偏差である「不純物」値が得られます。もちろん、1.0 からその数を引いた値が「純度」、つまり原色に近いことを示します。

それぞれの値を R、G、B として使用し、アルファを 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 に答える