2015-01-21 359 views
3

有人可以解釋爲什麼從hsv轉換回rgb時,從rgb轉換爲hsv不會產生相同結果?Android從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) 

回答

0

最後我找到了解決方案。 在android.graphics.Color.RGBToHSV的android實現中似乎有一個奇怪的近似值。 近似值恰好是在此實現中從0°到360°的色調。

我發現了java.util.Color.RGBtoHSB的代碼,其中HUE從0.0f變爲1.0f,轉換效果很好。所以不是一個浮點精度問題,而是一個執行錯誤,事實上,通過將Hue * 360f加上我得到正確的HSV色調值。

0
float[] hsv = new float[3]; 

我想這足以回答你的問題,轉換的結果是HSV與範圍[0.0, 1.0]所以你面對的精度有限,因此將它轉換回不給的值完全相同。

+0

我也想過,之所以是這樣的。你知道任何其他方法確切轉換嗎? – 2015-01-21 12:34:07

-2

修復使用此:

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);