mirror of
https://github.com/6543/go-hexcolor
synced 2025-04-18 15:16:53 +00:00
77 lines
1.3 KiB
Go
77 lines
1.3 KiB
Go
package hexcolor
|
|
|
|
import (
|
|
"fmt"
|
|
"image/color"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// HexColor represents a single hex color
|
|
type HexColor struct {
|
|
original string
|
|
hex string
|
|
}
|
|
|
|
// NewHexColor convert string into a HexColor
|
|
func NewHexColor(hc string) (*HexColor, error) {
|
|
c := &HexColor{original: hc}
|
|
hc = strings.TrimLeft(strings.ToLower(hc), "#")
|
|
|
|
if _, err := strconv.ParseUint(hc, 16, 24); err == nil {
|
|
if len(hc) == 6 {
|
|
c.hex = hc
|
|
return c, nil
|
|
}
|
|
if len(hc) == 3 {
|
|
c.hex = string([]byte{hc[0], hc[0], hc[1], hc[1], hc[2], hc[2]})
|
|
return c, nil
|
|
}
|
|
}
|
|
|
|
// handle named colors
|
|
|
|
return nil, fmt.Errorf("Malformed color: %s", hc)
|
|
}
|
|
|
|
// ToString return normalized hex code of color
|
|
func (c *HexColor) ToString() string {
|
|
if c == nil {
|
|
return ""
|
|
}
|
|
return c.hex
|
|
}
|
|
|
|
// ToRGBA return RGBA color
|
|
func (c *HexColor) ToRGBA() (*color.RGBA, error) {
|
|
if c == nil {
|
|
return nil, nil
|
|
}
|
|
var r, g, b uint8
|
|
if _, err := fmt.Sscanf(c.hex, "%2x%2x%2x", &r, &g, &b); err != nil {
|
|
return nil, err
|
|
}
|
|
return &color.RGBA{
|
|
R: r,
|
|
G: g,
|
|
B: b,
|
|
A: 0xff,
|
|
}, nil
|
|
}
|
|
|
|
// ToHexColor convert RGBA to HexColor
|
|
func ToHexColor(c *color.RGBA) *HexColor {
|
|
toS := func(i uint8) string {
|
|
h := fmt.Sprintf("%x", i)
|
|
if len(h) == 1 {
|
|
h = "0" + h
|
|
}
|
|
return h
|
|
}
|
|
|
|
return &HexColor{
|
|
original: fmt.Sprintf("%v", c),
|
|
hex: toS(c.R) + toS(c.G) + toS(c.B),
|
|
}
|
|
}
|