使用什么算法将一个字母转换为颜色Gmail-style?
What algorithm to use to convert one letter to color Gmail-style?
在某些电子邮件应用程序中,列表项显示为'cards',每个列表项都有一个大圆形图标,带有header 文本的第一个字母。转换是稳定的——每个字母每次都转换成相同的颜色(颜色和字母的数量可能不匹配)。我想,它可能会大大改善视觉和导航。
我可以将每个字母的颜色值硬编码到某种字典中。但我想根据字母代码获得颜色(类似于 Google 的颜色)以避免硬编码。
所以,问题是 - 使用什么算法从字母中获取 Gmail-like 颜色。
任何编程语言都可以作为解决方案,但 C# 更可取。
如果算法能涵盖任何字符,不仅是拉丁字母符号,还可能是西里尔字符和一些特殊字符(如@、#、$、% 等),那就太好了
附上我自己帐户中的样本。
这是一个非常简单的算法,请注意您应该根据自己的需要对其进行调整:
首先,我将获取一个字符,从中获取 ASCII 码。
然后我会通过在前面添加零来确保它是 3 个数字。
然后将该值及其前后的值用作RGB颜色。
代码如下:
Console.Write("Please enter a given character: ");
var characterCode = Convert.ToInt32(Console.ReadKey().KeyChar).ToString();
Console.WriteLine("");
// Convert integer 182 as a hex in a string variable
string characterRColor = characterCode.PadLeft(3, '0');
string characterGColor = (Convert.ToInt32(characterCode) - 1).ToString().PadLeft(3, '0');
string characterBColor = (Convert.ToInt32(characterCode) + 1).ToString().PadLeft(3, '0');
Console.WriteLine("R Color: " + characterRColor);
Console.WriteLine("G Color: " + characterGColor);
Console.WriteLine("B Color: " + characterBColor);
Console.ReadLine();
public static Color ToColorFromTitleCaseLetters(this string fullName)
{
if (fullName.IsNullOrEmpty()) return Color.Blue;
try
{
string result = string.Concat(Regex
.Matches(fullName, "[A-Z]")
.OfType<Match>()
.Select(match => match.Value));
int hash = 1;
if (result.Length > 1)
{
hash = (Convert.ToInt32(result[0]) - 64) * 100 + Convert.ToInt32(result[1]) - 64;
//
string[] colors = new[]
{
"008000", "0000FF", "800080", "800080", "FF00FF", "008080", "FFFF00", "808080", "00FFFF",
"000080",
"800000", "FF3939", "7F7F00", "C0C0C0", "FF6347", "FFE4B5", "33023", "B8860B", "C04000",
"6B8E23", "CD853F", "C0C000", "228B22", "D2691E", "808000", "20B2AA", "F4A460", "00C000",
"8FBC8B", "B22222", "843A05", "C00000"
};
int max = (('Z' - 64) * 100 + 'Z' - 64);
decimal index = ((decimal) hash / (decimal) max) * colors.Length;
return Color.FromHex(colors[(int) index]);
}
}
catch
{
}
return Color.Blue;
}
在某些电子邮件应用程序中,列表项显示为'cards',每个列表项都有一个大圆形图标,带有header 文本的第一个字母。转换是稳定的——每个字母每次都转换成相同的颜色(颜色和字母的数量可能不匹配)。我想,它可能会大大改善视觉和导航。
我可以将每个字母的颜色值硬编码到某种字典中。但我想根据字母代码获得颜色(类似于 Google 的颜色)以避免硬编码。
所以,问题是 - 使用什么算法从字母中获取 Gmail-like 颜色。
任何编程语言都可以作为解决方案,但 C# 更可取。
如果算法能涵盖任何字符,不仅是拉丁字母符号,还可能是西里尔字符和一些特殊字符(如@、#、$、% 等),那就太好了
附上我自己帐户中的样本。
这是一个非常简单的算法,请注意您应该根据自己的需要对其进行调整:
首先,我将获取一个字符,从中获取 ASCII 码。 然后我会通过在前面添加零来确保它是 3 个数字。 然后将该值及其前后的值用作RGB颜色。
代码如下:
Console.Write("Please enter a given character: ");
var characterCode = Convert.ToInt32(Console.ReadKey().KeyChar).ToString();
Console.WriteLine("");
// Convert integer 182 as a hex in a string variable
string characterRColor = characterCode.PadLeft(3, '0');
string characterGColor = (Convert.ToInt32(characterCode) - 1).ToString().PadLeft(3, '0');
string characterBColor = (Convert.ToInt32(characterCode) + 1).ToString().PadLeft(3, '0');
Console.WriteLine("R Color: " + characterRColor);
Console.WriteLine("G Color: " + characterGColor);
Console.WriteLine("B Color: " + characterBColor);
Console.ReadLine();
public static Color ToColorFromTitleCaseLetters(this string fullName)
{
if (fullName.IsNullOrEmpty()) return Color.Blue;
try
{
string result = string.Concat(Regex
.Matches(fullName, "[A-Z]")
.OfType<Match>()
.Select(match => match.Value));
int hash = 1;
if (result.Length > 1)
{
hash = (Convert.ToInt32(result[0]) - 64) * 100 + Convert.ToInt32(result[1]) - 64;
//
string[] colors = new[]
{
"008000", "0000FF", "800080", "800080", "FF00FF", "008080", "FFFF00", "808080", "00FFFF",
"000080",
"800000", "FF3939", "7F7F00", "C0C0C0", "FF6347", "FFE4B5", "33023", "B8860B", "C04000",
"6B8E23", "CD853F", "C0C000", "228B22", "D2691E", "808000", "20B2AA", "F4A460", "00C000",
"8FBC8B", "B22222", "843A05", "C00000"
};
int max = (('Z' - 64) * 100 + 'Z' - 64);
decimal index = ((decimal) hash / (decimal) max) * colors.Length;
return Color.FromHex(colors[(int) index]);
}
}
catch
{
}
return Color.Blue;
}