12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- 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) {
- if a.ViewSize.Width == 0 || a.ViewSize.Height == 0 {
- return nil, util.NewError("Create Text", "指定元素未设置长宽")
- }
- 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
- }
|