web-dev-qa-db-ja.com

16進数をRGBに変換する方法は?

これを使用して、色が明るいか暗いかを判断しようとしています

HEX値が暗いか明るいかを評価する

今。 intを受け取ります

 float calcLuminance(int rgb)
 {
      int r = (rgb & 0xff0000) >> 16;
      int g = (rgb & 0xff00) >> 8;
      int b = (rgb & 0xff);

      return (r*0.299f + g*0.587f + b*0.114f) / 256;
 }

私は16進数の色を持っています。

私はこれをやろうとしました

  var color = System.Drawing.ColorTranslator.FromHtml("#FFFFFF");
  int rgb = color.R + color.G + color.B;
   var a = calcLuminance(rgb);

私は0.11725を取得しました。0〜256の範囲か、そのようなものでなければならないと思いました。

何が悪いのですか? Rintに変換する必要がありますか?それとも私はちょうど道を外れていますか?

19
chobo2

これを使用して、色が明るいか暗いかを判断しようとしています

Color.GetBrightness() を使用するだけです


[編集]

テキストに白と黒のどちらを使用するかを決定したいと思います。それで、≦.5私は白と> .5黒を使うべきですか?

numberofways は、特定の背景で使用する色を決定するためのもので、どれも完璧ではありません。

その最後のリンクでは、実際には黒/白のみを使用することをお勧めしていますが、0.5ではなく0.73のカットオフポイントを選択しています。私はあなたはそれでうまくいくべきだと思います、そしてそれがあなたのためにうまくいかないとわかったらそれを変えてください。

16進数文字列を整数に変換するだけです。

int color = Convert.ToInt32("FFFFFF", 16);
20
Chris Haas

以下を使用できます。

public string GenerateRgba(string backgroundColor, decimal backgroundOpacity)
{
 Color color = ColorTranslator.FromHtml(hexBackgroundColor);
 int r = Convert.ToInt16(color.R);
 int g = Convert.ToInt16(color.G);
 int b = Convert.ToInt16(color.B);
 return string.Format("rgba({0}, {1}, {2}, {3});", r, g, b, backgroundOpacity);
}

git上のjeremy cliftonによる元の投稿へのリンク

9
Milind Anantwar

少しトピックですが、ここでは、さまざまなアルゴリズムで輝度を計算するために作成したColor構造体の拡張メソッドを示します。お役に立てば幸いです。

public static class ColorExtensions
{
    /// <summary>
    /// Gets the luminance of the color. A value between 0 (black) and 1 (white)
    /// </summary>
    /// <param name="color">The color.</param>
    /// <param name="algorithm">The type of luminance alg to use.</param>
    /// <returns>A value between 0 (black) and 1 (white)</returns>
    public static double GetLuminance(this Color color, LuminanceAlgorithm algorithm = LuminanceAlgorithm.Photometric)
    {
        switch (algorithm)
        {
            case LuminanceAlgorithm.CCIR601:
                return (0.2126 * color.R + 0.7152 * color.G + 0.0722 * color.B) / 255;

            case LuminanceAlgorithm.Perceived:
                return (Math.Sqrt(0.241 * Math.Pow(color.R, 2) + 0.691 * Math.Pow(color.G, 2) + 0.068 * Math.Pow(color.B, 2)) / 255);

            case LuminanceAlgorithm.Photometric:
                return (0.299 * color.R + 0.587 * color.G + 0.114 * color.B) / 255;
        }

    }

   /// <summary>
   /// The luminances
   /// </summary>
   public enum LuminanceAlgorithm
   {
       /// <summary>
       /// Photometric/digital ITU-R
       /// </summary>
       Photometric,

       /// <summary>
       /// Digital CCIR601 (gives more weight to the R and B components, as preciev by the human eye)
       /// </summary>
       CCIR601,

       /// <summary>
       /// A perceived luminance
       /// </summary>
       Perceived
   }
}
3
Magnus

私が見るように、問題はrgbの計算です。値を加算すると、0から3 * 255までの数値が得られますが、これは明らかにメソッドが期待する値ではありません。このように計算する必要があります

int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;

これはこれと同等でなければなりません(使用しないアルファ値を除く)

int rgb = color.ToArgb();

最後に、Chris Haasの回答でわかるように、直接intに変換することでこの手順をスキップできます。

2
Lasse Espeholt

calcLuminanceはパーセントのみを返します。

1
Daniel A. White

あなたのアイデアは大丈夫​​ですが、あなたの機能は間違っています、正しいものはここにあります:

int rgb = Convert.ToInt32("#FFFFFF", 16);
var a = calcLuminance(rgb);

float calcLuminance(int rgb)
{
    int r = (rgb & 0xff0000) >> 16;
    int g = (rgb & 0xff00) >> 8;
    int b = (rgb & 0xff);
    return (r*0.299f + g*0.587f + b*0.114f) / 256;
}
0
Xiaohuan ZHOU

R 構造体のGB、およびColorの範囲は、0〜255です。

関数で期待するRGB値を取得するには、それに応じて左シフトする必要があります。

int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;
0
Oded