我不知道 Color.RGBtoHSB(r, g, b, hsb) 函数是否在将 r,g,b 转换为 H,S,B 之前对其进行规范化,或者我在哪里可以获得它们内置函数的 java 实现。
问问题
1333 次
4 回答
2
这是实现,直接来自 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;
}
于 2012-08-31T13:46:29.543 回答
2
只需打开 Eclipse - Ctrl+Shift+T(打开类型),输入 Color,在 java.awt 中找到一个 - 瞧。适用于大多数内置类型。
于 2012-08-31T13:47:32.723 回答
0
RGB 不是首先归一化的。它在期间正常化,通常只是在正确的范围内。所以亮度是最大的分量,亮度从 0-255 范围归一化到 0-1 范围。饱和度也是这样,它是从最大分量到最小分量的距离,被压缩到 0-1 的范围内。色调是色轮中的角度。但是,不,它直接转换为 HSV,而不是通过 sRGB 之类的东西进行归一化(sRGB 是 RGB/255 并归一化为 0-1 范围)。
但是,您根本不需要知道这一点。它转换为 HSB。如果你来回转换一堆,你会得到舍入错误吗?你当然可以。除此之外,将 RGB 缩放到 1 或 1,000,000 并不重要,它会转换为完全不同的方式来表示 0-1 之间的颜色。
于 2012-09-06T09:24:44.687 回答
0
注意:从返回的色调Color.RGBtoHSB
在 0.0 和 1.0 之间进行归一化,而不是在 0 和 255 之间:```
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));
}
}
```
于 2018-03-11T17:17:49.943 回答