package image import ( "fmt" "gopkg.in/gographics/imagick.v3/imagick" "icloudapp.cn/tools/util" "strconv" "strings" ) type Color struct { Red uint32 Green uint32 Blue uint32 Alpha uint32 R uint8 G uint8 B uint8 A uint8 } func NewColor(color string) *Color { return &Color{} } // PaddingColorTo8 将color补充到8位,最后两位位Alpha func PaddingColorTo8(color string) string { hexColor := strings.Replace(color, "#", "", 1) strRune := []rune(hexColor) var strBuild strings.Builder if len(hexColor) == 3 { for i := 0; i < 3; i++ { strBuild.WriteString(string(strRune[i])) strBuild.WriteString(string(strRune[i])) } strBuild.WriteString("FF") hexColor = strBuild.String() } if len(hexColor) > 8 { hexColor = util.CutString(hexColor, 0, 8) } strBuild.WriteString(hexColor) if len(hexColor) < 8 { padding := 8 - len(hexColor) for i := 0; i < padding; i++ { strBuild.WriteString("F") } } return strBuild.String() } // Alpha rgb alpha 0 透明 -> 1 不透明 func Alpha(color string) (string, Color, float64) { // 0 透明 -> 1 不透明 opacity := 1.0 hexColor := PaddingColorTo8(color) color = util.CutString(hexColor, 0, 6) hexAlpha, _ := strconv.ParseInt(util.CutString(hexColor, 6, 8), 16, 10) opacity = float64(int((float64(hexAlpha)/255)*100)) / 100 color = fmt.Sprintf("#%s", color) var rgb Color rgbRune := []rune(hexColor) red := string(rgbRune[0:2]) r, _ := strconv.ParseInt(red, 16, 10) rgb.Red = uint32(r) rgb.R = uint8(r) green := string(rgbRune[2:4]) g, _ := strconv.ParseInt(green, 16, 10) rgb.Green = uint32(g) rgb.G = uint8(g) blue := string(rgbRune[4:6]) b, _ := strconv.ParseInt(blue, 16, 10) rgb.Blue = uint32(b) rgb.B = uint8(b) alpha := string(rgbRune[6:8]) a, _ := strconv.ParseInt(alpha, 16, 10) rgb.Alpha = uint32(a / 255) rgb.A = uint8(a) return color, rgb, opacity } // Pixel PixelWand func Pixel(color string) *imagick.PixelWand { destColor, _, alpha := Alpha(color) g := imagick.NewPixelWand() g.SetColor(destColor) g.SetAlpha(alpha) return g } func OpacityPixel() *imagick.PixelWand { pw := imagick.NewPixelWand() pw.SetColor("none") return pw }