package image import ( "gopkg.in/gographics/imagick.v3/imagick" "icloudapp.cn/tools/util" ) type Avatar struct { Src string Border float64 BackgroundColor string AvatarImagick *imagick.MagickWand ViewSize *Size ViewPoint *Point Angle float64 } func NewAvatar() *Avatar { return &Avatar{} } func (a *Avatar) SetBorder(border float64) { a.Border = border } func (a *Avatar) SetBackgroundColor(backgroundColor string) { a.BackgroundColor = backgroundColor } func (a *Avatar) SetAvatar(src string) { a.Src = src } func (a *Avatar) SetSize(width, height uint) { a.ViewSize = NewSize(width, height) } func (a *Avatar) SetViewPoint(x, y float64) { a.ViewPoint = NewPoint(x, y) } func (a *Avatar) SetAngle(angle float64) { a.Angle = angle } func (a *Avatar) Create() (*imagick.MagickWand, error) { border := imagick.NewDrawingWand() border.SetStrokeOpacity(1) border.SetStrokeColor(Pixel(a.BackgroundColor)) border.SetFillColor(Pixel(a.BackgroundColor)) border.SetStrokeWidth(a.Border) border.SetFontSize(72) border.Circle(float64(a.ViewSize.Width)/2, float64(a.ViewSize.Height)/2, float64(a.ViewSize.Width)/2, float64(a.ViewSize.Height)) borderImagick := imagick.NewMagickWand() if err := borderImagick.NewImage(a.ViewSize.Width+uint(a.Border), a.ViewSize.Height+uint(a.Border), OpacityPixel()); err != nil { return nil, util.NewError("borderImagick.NewImage err : ", err.Error()) } if err := borderImagick.DrawImage(border); err != nil { return nil, util.NewError("borderImagick.DrawImage err : ", err.Error()) } avatarImagick := imagick.NewMagickWand() if err := avatarImagick.ReadImage(a.Src); err != nil { return nil, util.NewError("avatarImagick.ReadImage err : ", err.Error()) } if err := avatarImagick.ResizeImage(a.ViewSize.Width-uint(a.Border), a.ViewSize.Height-uint(a.Border), imagick.FILTER_LANCZOS); err != nil { return nil, util.NewError("avatarImagick.ResizeImage err : ", err.Error()) } if err := avatarImagick.SetImageFormat("PNG"); err != nil { return nil, util.NewError("avatarImagick.SetImageFormat err : ", err.Error()) } if err := borderImagick.CompositeImage(avatarImagick, imagick.COMPOSITE_OP_OVER, true, int(a.Border), int(a.Border)); err != nil { return nil, util.NewError("borderImagick.CompositeImage err : ", err.Error()) } if a.Angle > 0 { if err := borderImagick.RotateImage(OpacityPixel(), a.Angle); err != nil { return nil, util.NewError("qrWM.RotateImage err : ", err.Error()) } alignX := float64(borderImagick.GetImageWidth()-a.ViewSize.Width) / 2 alignY := float64(borderImagick.GetImageHeight()-a.ViewSize.Height) / 2 a.ViewPoint.X = alignX a.ViewPoint.Y = alignY } return borderImagick, nil }