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) です。変化する唯一のコンポーネントは明るさです。) しかし、カラー ホイールにはグレースケールの色がないため...