1 回答
TA贡献1877条经验 获得超1个赞
简单的解决方案
该包golang.org/x/image/colornames还包含一个导出的Map变量,该变量从小写颜色名称映射到color.RGBA.
因此,只需使用此映射来查找名称的颜色,并将 RGB 分量转换为十六进制表示:
func convertWebToHex(webcolorname string) (hexcolor string) {
c, ok := colornames.Map[webcolorname]
if !ok {
// Unknown name
return ""
}
return fmt.Sprintf("#%02X%02X%02X", c.R, c.G, c.B)
}
测试它:
names := []string{
"red",
"yellow",
"lightyellow",
"invalid",
}
for _, name := range names {
fmt.Printf("%-12s: %s\n", name, convertWebToHex(name))
}
哪些输出(在Go Playground上尝试):
red : #FF0000
yellow : #FFFF00
lightyellow : #FFFFE0
invalid :
不区分大小写的解决方案
如果您想以不区分大小写的方式查找颜色,请使用strings.ToLower()将名称转换为小写,然后继续查找:
func convertWebToHex(webcolorname string) (hexcolor string) {
c, ok := colornames.Map[strings.ToLower(webcolorname)]
if !ok {
// Unknown name
return ""
}
return fmt.Sprintf("#%02X%02X%02X", c.R, c.G, c.B)
}
测试它:
names := []string{
"Red",
"yELLOW",
"LightYellow",
"invalid",
}
for _, name := range names {
fmt.Printf("%-12s: %s\n", name, convertWebToHex(name))
}
哪些输出(在Go Playground上尝试):
Red : #FF0000
yELLOW : #FFFF00
LightYellow : #FFFFE0
invalid :
预先计算的十六进制值
另请注意,如果您必须经常进行这些查找,创建自己的地图可能会有利可图,您可以将颜色名称映射到生成的十六进制字符串,因此您不必一直转换color.RGBA为十六进制字符串。
这是这个预先计算的地图解决方案的样子:
var colorMap = map[string]string{}
func init() {
for name, c := range colornames.Map {
colorMap[name] = fmt.Sprintf("#%02X%02X%02X", c.R, c.G, c.B)
}
}
func convertWebToHex(webcolorname string) (hexcolor string) {
// invalid color results in the zero value ""
return colorMap[strings.ToLower(webcolorname)]
}
测试和输出是一样的。在Go Playground上试试这个。
- 1 回答
- 0 关注
- 89 浏览
添加回答
举报