如何解析web color的RGB颜色从image/color
转换为Color
?go有内置的解析器吗?我希望能够解析#XXXXXX
和#XXX
的颜色格式。color
文档对此没有说明:https://golang.org/pkg/image/color/但是这个任务很常见,所以我相信go有一些函数(我只是没有找到)。
更新:我创建了一个基于accepted的小型Go库回答:github.com/g4s8/hexcolor
如何解析web color的RGB颜色从image/color
转换为Color
?go有内置的解析器吗?我希望能够解析#XXXXXX
和#XXX
的颜色格式。color
文档对此没有说明:https://golang.org/pkg/image/color/但是这个任务很常见,所以我相信go有一些函数(我只是没有找到)。
更新:我创建了一个基于accepted的小型Go库回答:github.com/g4s8/hexcolor
4条答案
按热度按时间iecba09b1#
**前言:**我在
github.com/icza/gox
中发布了这个实用程序(2.快速解决方案),请参见colorx.ParseHexColor()
。1.优雅解决方案
这里有另一个使用
fmt.Sscanf()
的解决方案。它当然不是最快的解决方案,但它很优雅。它直接扫描到color.RGBA
结构体的字段:字符串
测试它:
型
输出(在Go Playground上尝试):
型
2.快速解决方案
如果性能确实很重要,
fmt.Sscanf()
是一个非常糟糕的选择。它需要一个格式字符串,实现必须解析它,并根据它解析输入,并使用反射将结果存储为指向的值。由于这个任务基本上只是“解析”一个十六进制值,我们可以做得更好,我们甚至不必调用通用的十六进制解析库(例如
encoding/hex
),我们可以自己做。我们甚至不必将输入视为string
,甚至视为一系列rune
s,我们可以降低到将其视为一系列字节的水平。是的,Go语言将string
的值以UTF-8字节序列的形式存储在内存中,但是如果输入是一个有效的颜色字符串,那么它的所有字节都必须在0..127
的范围内,这些字节Map到字节1到1。如果不是这样,那么输入已经是无效的,我们将检测到,但是在这种情况下我们返回什么颜色不重要(不重要)。现在让我们看看一个快速的实现:
型
使用与第一个示例相同的输入进行测试,输出为(在Go Playground上尝试):
型
3.基准测试
让我们对这两个解决方案进行基准测试。基准测试代码将包括用长格式和短格式调用它们。错误情况被排除在外。
型
以下是基准测试结果:
型
正如我们所看到的,“快速”解决方案大约快250倍,并且不使用分配(不像“优雅”解决方案)。
wpx232ag2#
RGBA颜色只有4个字节,分别用于红色,绿色,蓝色和alpha通道。对于三个或六个十六进制数字,alpha字节通常被暗示为0xFF(
AABBCC
被认为与AABBCCFF
相同,ABC
也是如此)。因此,解析颜色字符串非常简单,只需将其规范化,使其具有“RRGGBBAA”(4个十六进制编码字节)的形式,然后对其进行解码:
字符串
在操场上试试:https://play.golang.org/p/aCX-vyfMG4G
uhry853o3#
您可以使用
strconv.ParseUint
将任何2个十六进制数字转换为整数字符串
16
表示基数16(十六进制),8表示位数,在本例中为一个字节。您可以使用它将每2个字符解析为它们的组成部分
https://play.golang.org/p/B56B8_NvnVR
型
编辑:感谢Peter的更正
4bbkushb4#
如果你确定你在做什么,你可以给予this作为函数的直接参数。
字符串
测试
型