C# 如何将十六进制转换为RGB?
我试着用这个来判断一种颜色是亮的还是暗的 现在。它接受一个C# 如何将十六进制转换为RGB?,c#,.net,colors,hex,rgb,C#,.net,Colors,Hex,Rgb,我试着用这个来判断一种颜色是亮的还是暗的 现在。它接受一个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; }
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;
}
我有一个六边形的颜色
我试着这么做
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
?或者说我离这太远了?结构的R
、G
和B
的范围是0-255
要获得函数中预期的rgb值,需要相应地左移:
int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;
intrgb=(int)color.R在我看来,问题在于如何计算rgb
。将这些值相加,得到一个介于0和3*255之间的数字,这显然不是方法所期望的值。你必须这样计算
int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;
最后,正如您在Chris Haas answer中看到的,您可以通过直接转换为整数跳过这一步。CalClunInance
只返回一个百分比。只需将十六进制字符串转换为整数:
int color = Convert.ToInt32("FFFFFF", 16);
我试着用这个来判断一种颜色是亮的还是暗的
只用
[编辑]
我想确定我的文本应该使用白色还是黑色。什么都可以≤ .5我应该使用白色和>0.5黑色
在给定的背景上,有很多方法可以决定使用什么颜色,但没有一种是完美的
最后一个链接实际上建议只使用黑/白,但选择0.73而不是0.5的截止点。我认为你应该这样做,如果你发现它不适合你,就改变它。这是一个小主题,但这里是我创建的颜色结构的一个扩展方法,用不同的算法计算亮度。希望对你有帮助
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
}
}
公共静态类扩展
{
///
///获取颜色的亮度。值介于0(黑色)和1(白色)之间
///
///颜色。
///要使用的亮度alg的类型。
///介于0(黑色)和1(白色)之间的值
public static double GetLuminance(此颜色,亮度算法=亮度算法.光度)
{
开关(算法)
{
案例亮度算法.CCIR601:
返回值(0.2126*color.R+0.7152*color.G+0.0722*color.B)/255;
案例亮度算法。感知:
返回(Math.Sqrt(0.241*Math.Pow(color.R,2)+0.691*Math.Pow(color.G,2)+0.068*Math.Pow(color.B,2))/255);
案例亮度算法。光度控制:
返回值(0.299*color.R+0.587*color.G+0.114*color.B)/255;
}
}
///
///亮度
///
公共枚举亮度算法
{
///
///光度/数字ITU-R
///
光度,
///
///数字CCIR601(赋予R和B分量更大的权重,如人眼所精确)
///
CCIR601,
///
///可感知的亮度
///
感知
}
}
您可以使用:
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);
}
您的想法是正确的,但您的功能是错误的,正确的功能在这里:
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;
}
哎呀,我把这个投了高票,因为我误读了这个问题。他实际上并不是在问“如何从十六进制转换为RGB”——他真正想知道的是如何获得RGB颜色的亮度(亮度)。他有两个不同的潜在问题。“如何做x”和“有比x更好的方法吗?”。我回答了第一个,你回答了第二个@BlueRaja-Danny Pflughoeft-类似于这个System.Drawing.Color someColor=System.Drawing.Color.FromArgb(Color.R,Color.G,Color.B);float ab=someColor.GetBrightness();在不首先将其转换为rgb的情况下,是否仍然可以执行此操作?@chobo2 Justfloat ab=System.Drawing.ColorTranslator.FromHtml(“#ffffffff”).GetBrightness()代码>:)@Chobo:那你是怎么把颜色输入电脑的?您给出的示例是RGB:在“#FFFFFF”
中,第一个“FF”
是R(十六进制),第二个“FF”
是G,第三个“FF”
是B。正如@lassespeholt在上面的注释中所述,您可以在一行中从RGB字符串获得亮度。@lassespeholt-Cool。所以我想确定我的文本应该使用白色还是黑色。所以任何小于等于.5的东西我都应该使用白色,如果大于.5,我应该使用黑色?亮度和亮度不是一回事。我使用亮度来确定颜色是暗还是亮得到了更好的结果
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;
}