android从rgb转换为hsv,反之亦然

Mar*_*ala 5 rgb android colors hsv

有人可以解释为什么从hsv转换回rgb时,从rgb转换为hsv不会得到相同的结果?

int color = Color.rgb(206, 43, 55);

int red = Color.red(color);
int green = Color.green(color);
int blue = Color.blue(color);
System.out.println(red + ", " + green + ", " + blue);
//prints: 206, 43, 55 (as expected)

float[] hsv = new float[3];
Color.RGBToHSV(red, green, blue, hsv);

float hue = hsv[0];
float sat = hsv[1];
float val = hsv[2];

int outputColor = Color.HSVToColor(hsv);
red = Color.red(outputColor);
green = Color.green(outputColor);
blue = Color.blue(outputColor);
System.out.println(red + ", " + green + ", " + blue);

//prints: 206, 42, 54 (green and blue are changed)
Run Code Online (Sandbox Code Playgroud)

bay*_*cek 7

如果有人用 Kotlin 语言研究从 RGB 到 HSV 的转换,反之亦然:

// define array and color
var hsv = FloatArray(3)
var currentColor = Color.rgb(206, 43, 55);
Run Code Online (Sandbox Code Playgroud)
// RGB to HSV
Color.colorToHSV(currentColor, hsv)

// hsv[0] --> hue
// hsv[1] --> saturation
// hsv[2] --> value
Run Code Online (Sandbox Code Playgroud)
// HSV to RGB
currentColor = Color.HSVToColor(hsv)

// assign red, green and blue
r = Color.red(currentColor)
g = Color.green(currentColor)
b = Color.blue(currentColor)

Run Code Online (Sandbox Code Playgroud)


Mar*_*ala 5

最后我找到了解决方案。的 android 实现中似乎有一个奇怪的近似android.graphics.Color.RGBToHSV。近似值正是此实现中从 0° 到 360° 的色调。

我找到了 java.awt.Color.RGBtoHSB 的代码,其中 HUE 从 0.0f 到 1.0f 并且转换效果很好。所以不是浮点精度错误而是实现错误,实际上通过乘以Hue * 360f我得到正确的 HSV Hue 值。