2015-12-27 13 views
6

壁紙を作成しようとしていますが、「android.graphics.color」クラスでHSV変換を使用しています。特定の色相(0..360)のrgbカラー(整数)とHSVカラーへの逆変換で同じ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です。 なぜ私の意見では、比較的大きな不正確さがあるのだろうかと思います。

しかし、もっと大きな問題は、コードにその値を再入力すると、新しい結果が再び減少することです。

私が99.76471で始まる場合、私は99.52941を取得します。これは私のための一種の問題です。 私はこれらの問題を抱えていなかった "java.awt.Color"クラスを使用して、javaで同様のことを行いました。残念ながら、私はアンドロイドでこのクラスを使用することはできません。

+0

*これは、16と32ビットの整数の間で使用される異なる変換の場合ですが、これはオフになる可能性があります。私は何年か前に、サウンドファイルとバイト配列からの変換に問題があることを覚えています。最後に、図を最も近い整数に丸めました。 – dave

+1

私はdaveのアイデアを支持しています。便利なことは、元の値100と99.76471の丸められた結果の差が60/255で、255 = 2^8-1(8ビットにrgb値を格納するのが一般的です) 。 99.76471と99.52941についても同様です。私は完全な理論を持っていませんが、基本的な算術演算が間違っているようです。 – elias

答えて

1

これは興味深い問題です。浮動小数点精度が低いため、アンドロイドクラスでは回避できません。しかし、私は同様の解決策は、javascript hereで書かれています。

それはあなたが変換を行うために、独自のメソッド/クラスを定義したいために十分に重要だ場合は、ここであなたをより良い精度を与える必要がありますJavaの変換です:

@Size(3) 
/** Does the same as {@link android.graphics.Color#colorToHSV(int, float[])} */ 
public double[] colorToHSV(@ColorInt int color) { 
    //this line copied vertabim 
    return rgbToHsv((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF); 
} 

@Size(3) 
public double[] rgbToHsv(double r, double g, double b) { 
    final double max = Math.max(r, Math.max(g, b)); 
    final double min = Math.min(r, Math.min(g, b)); 
    final double diff = max - min; 
    final double h; 
    final double s = ((max == 0d)? 0d : diff/max); 
    final double v = max/255d; 
    if (min == max) { 
     h = 0d; 
    } else if (r == max) { 
     double tempH = (g - b) + diff * (g < b ? 6: 0); 
     tempH /= 6 * diff; 
     h = tempH; 
    } else if (g == max) { 
     double tempH = (b - r) + diff * 2; 
     tempH /= 6 * diff; 
     h = tempH; 
    } else { 
     double tempH = (r - g) + diff * 4; 
     tempH /= 6 * diff; 
     h = tempH; 
    } 
    return new double[] { h, s, v }; 
} 

私はここに無知を告白しなければなりません - 私は迅速な変換を行っており、適切にテストする時間がありませんでした。より最適な解決策があるかもしれませんが、少なくともこれを開始する必要があります。

+0

それは、より正確な倍精度は私の問題を解決しないようですが、それはまだ整数に丸められているので、同じ値を戻さないという問題があるかもしれません – user2957782

関連する問題