これを使用して、色が明るいか暗いかを判断しようとしています
今。 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の範囲か、そのようなものでなければならないと思いました。
何が悪いのですか? R
をint
に変換する必要がありますか?それとも私はちょうど道を外れていますか?
これを使用して、色が明るいか暗いかを判断しようとしています
Color.GetBrightness()
を使用するだけです
[編集]
テキストに白と黒のどちらを使用するかを決定したいと思います。それで、≦.5私は白と> .5黒を使うべきですか?
numberofways は、特定の背景で使用する色を決定するためのもので、どれも完璧ではありません。
その最後のリンクでは、実際には黒/白のみを使用することをお勧めしていますが、0.5ではなく0.73のカットオフポイントを選択しています。私はあなたはそれでうまくいくべきだと思います、そしてそれがあなたのためにうまくいかないとわかったらそれを変えてください。
16進数文字列を整数に変換するだけです。
int color = Convert.ToInt32("FFFFFF", 16);
以下を使用できます。
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);
}
少しトピックですが、ここでは、さまざまなアルゴリズムで輝度を計算するために作成した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
}
}
私が見るように、問題はrgb
の計算です。値を加算すると、0から3 * 255までの数値が得られますが、これは明らかにメソッドが期待する値ではありません。このように計算する必要があります
int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;
これはこれと同等でなければなりません(使用しないアルファ値を除く)
int rgb = color.ToArgb();
最後に、Chris Haasの回答でわかるように、直接intに変換することでこの手順をスキップできます。
calcLuminance
はパーセントのみを返します。
あなたのアイデアは大丈夫ですが、あなたの機能は間違っています、正しいものはここにあります:
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;
}
R
構造体のG
、B
、およびColor
の範囲は、0〜255です。
関数で期待するRGB値を取得するには、それに応じて左シフトする必要があります。
int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;