1

RGB と HSV の間で色変換を実行し、RGB に戻そうとしています。私が作成しているHSVカラーピッカープログラム用です。HSV コンポーネントを取得します。新しい彩度を自分の色に厳密に設定したいので、彩度の値を要求された値に等しく設定します。次に、RGB に変換します。ただし、Hue の値が変更されており、要求していません。さらに、彩度スライダーを常に動かすと、色相は最終的に、60、180、および 300 の色相を持つシアン、イエロー、またはマゼンタで色を並べます。彩度を設定するときに色相を変更しない方法はありますか?

注: getHue、getSaturation、および getValue は、colorCode の HSV コンポーネントを取得しています。

public void setSaturation(float s)
{
    float hsv[];
    hsv = new float[3];
    Log.i("Before change",String.valueOf("H: "+getHue()+" S: "+getSaturation()+" V: "+getValue()));
    Color.RGBToHSV(getRed(), getGreen(), getBlue(), hsv);
    hsv[1] = s;
    colorCode = Color.HSVToColor(hsv);
    Log.i("After change",String.valueOf("H: "+getHue()+" S: "+getSaturation()+" V: "+getValue()));
}

変更前(21558): H: 28.771929 S: 0.67058825 V: 1.0

変更後(21558): H: 28.928572 S: 0.65882355 V: 1.0

4

1 に答える 1

1

rgb から hsv への変換は非線形であり、float の精度はロスレス変換を行うには十分ではありません。ここでは、無損失の整数ベースの変換ソリューションを見つけることができます。その c++ ですが、Java に変換するのに十分簡単なはずです。

于 2012-04-21T09:18:32.367 に答える