我正在嘗試創建壁紙並在「android.graphics.color」類中使用HSV轉換。當我意識到將創建的具有指定色相(0..360)的HSV顏色轉換爲rgb顏色(整數)並將其轉換爲HSV顏色不會導致相同的色調時,我感到非常驚訝。這是我的代碼:Android上的HSV轉換不準確
int c = Color.HSVToColor(new float[] { 100f, 1, 1 });
float[] f = new float[3];
Color.colorToHSV(c, f);
alert(f[0]);
我以100度的色調開始,結果是99.76471。 我想知道爲什麼(在我看來)相對較大的不準確。
但是更大的問題是,當您再次將該值放入代碼中時,新結果會再次減少。
int c = Color.HSVToColor(new float[] { 99.76471f, 1, 1 });
float[] f = new float[3];
Color.colorToHSV(c, f);
alert(f[0]);
如果我以99.76471開頭,我會得到99.52941。這對我來說是一個問題。 我在java中用「java.awt.Color」類做了類似的事情,我沒有這些問題。不幸的是,我不能在android中使用這個類。
我相信*這是一個16位和32位整數之間使用不同轉換的情況,但這可能會失敗。我記得幾年前,我遇到了一個聲音文件和字節數組轉換問題。最後我只是將數字四捨五入到最接近的整數。 – dave
我支持戴夫的想法。可能有用的一件事是注意到原始值100與99.76471的四捨五入結果之間的差異是60/255,並且255 = 2^8-1(將rgb值存儲在8位上是相當常見的) 。 99.76471和99.52941也是如此。我沒有一個完整的理論,但似乎基本的算術出錯了。 – elias