我正在尝试将像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)]
}
测试和输出是一样的。在围棋场上试试这个。