给定一个颜色的rgb值如何转换成hex,反过来又如何转换?
在本节,我们需要掌握基本的面向对象知识--如何给一个类型添加方法。还需要掌握strconv这个包
type RGB struct {
red, green, blue int64
}
type HEX struct {
str string
}
现在我们就可以构建RGB的颜色对象和HEX的颜色对象了。对于对象来说,除了属性外,还应当包含一些方法。我们可以给RGB类型的对象一个方法,rgb2hex。
要把rgb转成hex,其实就是把r,g,b分别转成16进制(字符串),再拼起来。
strconv.FormatInt(r,16) //返回r的16进制表达
但是要注意,如果r,g,b中存在小于16的值,上面的方法就行不通了。比如r值为11,用上面的方法得到的是"b",但是合法的hex希望我们得到的是"0b",所以我们需要判断,如果得到的字符串只有一位,则在其左侧补上一个0
func t2x ( t int64 ) string {
result := strconv.FormatInt(t, 16)
if len(result) == 1{
result = "0" + result
}
return result
}
下面我们就可以写出我们的 rgb2hex 的函数了
func (color RGB) rgb2hex() HEX {
r := t2x(color.red)
g := t2x(color.green)
b := t2x(color.blue)
return HEX{r+g+b}
}
同样,我们也可以写出hex2rgb,这里我们使用strconv.ParseInt()来将字符串解析为整数
func (color HEX) hex2rgb() RGB {
r, _ := strconv.ParseInt(color.str[:2], 16, 10)
g, _ := strconv.ParseInt(color.str[2:4], 16, 18)
b, _ := strconv.ParseInt(color.str[4:], 16, 10)
return RGB{r,g,b}
}
func main() {
color1 := RGB{11,33,243}
fmt.Println(color1.rgb2hex().str)
color2 := HEX{"0b21f3"}
fmt.Println(color2.hex2rgb())
}
全部代码如下:
package main
import (
"fmt"
"strconv"
)
type RGB struct {
red, green, blue int64
}
type HEX struct {
str string
}
func t2x(t int64) string {
result := strconv.FormatInt(t, 16)
if len(result) == 1 {
result = "0" + result
}
return result
}
func (color RGB) rgb2hex() HEX {
r := t2x(color.red)
g := t2x(color.green)
b := t2x(color.blue)
return HEX{r + g + b}
}
func (color HEX) hex2rgb() RGB {
r, _ := strconv.ParseInt(color.str[:2], 16, 10)
g, _ := strconv.ParseInt(color.str[2:4], 16, 18)
b, _ := strconv.ParseInt(color.str[4:], 16, 10)
return RGB{r, g, b}
}
func main() {
color1 := RGB{11, 33, 243}
fmt.Println(color1.rgb2hex().str)
color2 := HEX{"0b21f3"}
fmt.Println(color2.hex2rgb())
}
执行结果:
D:/PROGRAM/Golang/src/study/RGBTransform/RGBTransform.exe [D:/PROGRAM/Golang/src/study/RGBTransform]
0b21f3
{11 33 243}
成功: 进程退出代码 0.