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

时间:2015-01-21 01:47:04

标签: android colors rgb hsv

有人可以解释为什么从hgv转换回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)

4 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

float[] hsv = new float[3];

我想这足以回答你的问题,转换的结果是HSV,范围为[0.0, 1.0],所以你处理的是有限精度,因此转换它不会给出完全相同的值。

答案 2 :(得分:1)

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

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

答案 3 :(得分:-3)

使用此修复:

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

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

// i delete this part
/*int outputColor = Color.HSVToColor(hsv);
red = Color.red(outputColor);
green = Color.green(outputColor);
blue = Color.blue(outputColor);*/

//use only this to get correct values (HSV)
System.out.println(hue + ", " + sat+ ", " + val);