为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕雪6442864 2022-07-11 15:44:04
我正在尝试将像 DarkOrange 这样的 webcolor 名称转换为该颜色的十六进制名称#FF8C00,尽管理想情况下它能够解析小写字母(darkorange)我注意到 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}
查看完整描述

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上试试这个。


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信