在 Go 中将 webcolor html 颜色名称转换为十六进制的函数 |深橙色 -> #FF8C00



我正在尝试将像DarkOrange这样的网络颜色名称转换为该颜色的十六进制#FF8C00 ,尽管理想情况下它可以解析小写字母(深橙色(

我注意到Go确实包含返回RGBA 的colornames包

import (
"golang.org/x/image/colornames"
"fmt"
)
func main() {
lightyellow := colornames.Lightyellow
fmt.Println("colour rgba: ", lightyellow)
}

但我希望能够编写一个函数,我可以将webcolor名称传入,并输出十六进制:

func convertWebToHex(webcolorname string)(hexcolor string){
PLEASE HELP WITH THIS
return hexcolor
}

简单解决方案

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: %sn", 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: %sn", 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)]
}

测试和输出是一样的。在围棋场上试试这个。

最新更新