Color.RGBtoHSB(r、g、b、hsb)関数がr、g、bをH、S、Bに変換する前に正規化するかどうか、または組み込み関数のJava実装をどこで取得できるかはわかりません。
4 に答える
Eclipseを開いて-Ctrl+Shift + T(開いたタイプ)、Colorと入力し、java.awtで見つけてください-そして出来上がり。ほとんどの組み込みタイプで機能します。
Colorクラスのソースコードから直接実装したものは次のとおりです。
public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) {
float hue, saturation, brightness;
if (hsbvals == null) {
hsbvals = new float[3];
}
int cmax = (r > g) ? r : g;
if (b > cmax) cmax = b;
int cmin = (r < g) ? r : g;
if (b < cmin) cmin = b;
brightness = ((float) cmax) / 255.0f;
if (cmax != 0)
saturation = ((float) (cmax - cmin)) / ((float) cmax);
else
saturation = 0;
if (saturation == 0)
hue = 0;
else {
float redc = ((float) (cmax - r)) / ((float) (cmax - cmin));
float greenc = ((float) (cmax - g)) / ((float) (cmax - cmin));
float bluec = ((float) (cmax - b)) / ((float) (cmax - cmin));
if (r == cmax)
hue = bluec - greenc;
else if (g == cmax)
hue = 2.0f + redc - bluec;
else
hue = 4.0f + greenc - redc;
hue = hue / 6.0f;
if (hue < 0)
hue = hue + 1.0f;
}
hsbvals[0] = hue;
hsbvals[1] = saturation;
hsbvals[2] = brightness;
return hsbvals;
}
RGBは最初に正規化されません。これは、通常は正しい範囲内で正規化されます。したがって、明るさは最大のコンポーネントであり、明るさは0〜255の範囲から0〜1の範囲に正規化されます。彩度もこのようなもので、最大のコンポーネントから最小のコンポーネントまでの距離であり、0-1の範囲に絞り込まれます。そして、色相はカラーホイールの角度です。ただし、HSVに直接変換されず、sRGBなどで正規化されません(sRGBはRGB / 255であり、0-1の範囲に正規化されます)。
しかし、これを実際に知る必要はまったくありません。HSBに変換します。束を前後に変換すると、丸め誤差が発生する可能性がありますか。できますよ。これ以外は、RGBを1または1,000,000にスケーリングするかどうかは関係ありませんが、0〜1の範囲の色を表すまったく異なる方法に変換されます。
注:から返される色相は、0から255の間ではなくColor.RGBtoHSB
、0.0から1.0の間で正規化されます: `` `
public static void main(String[] args) {
float[] hsbvals = new float[3];
Random random = new Random();
for(int i=0;i<20;i++) {
Color.RGBtoHSB(random.nextInt(256),random.nextInt(256),random.nextInt(256),hsbvals);
System.out.println(Arrays.toString(hsbvals));
}
}
`` `