avatar.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package image
  2. import (
  3. "gopkg.in/gographics/imagick.v3/imagick"
  4. "icloudapp.cn/tools/util"
  5. )
  6. type Avatar struct {
  7. Src string
  8. Border float64
  9. BackgroundColor string
  10. AvatarImagick *imagick.MagickWand
  11. ViewSize *Size
  12. ViewPoint *Point
  13. Angle float64
  14. }
  15. func NewAvatar() *Avatar {
  16. return &Avatar{}
  17. }
  18. func (a *Avatar) SetBorder(border float64) {
  19. a.Border = border
  20. }
  21. func (a *Avatar) SetBackgroundColor(backgroundColor string) {
  22. a.BackgroundColor = backgroundColor
  23. }
  24. func (a *Avatar) SetAvatar(src string) {
  25. a.Src = src
  26. }
  27. func (a *Avatar) SetSize(width, height uint) {
  28. a.ViewSize = NewSize(width, height)
  29. }
  30. func (a *Avatar) SetViewPoint(x, y float64) {
  31. a.ViewPoint = NewPoint(x, y)
  32. }
  33. func (a *Avatar) SetAngle(angle float64) {
  34. a.Angle = angle
  35. }
  36. func (a *Avatar) Create() (*imagick.MagickWand, error) {
  37. border := imagick.NewDrawingWand()
  38. border.SetStrokeOpacity(1)
  39. border.SetStrokeColor(Pixel(a.BackgroundColor))
  40. border.SetFillColor(Pixel(a.BackgroundColor))
  41. border.SetStrokeWidth(a.Border)
  42. border.SetFontSize(72)
  43. border.Circle(float64(a.ViewSize.Width)/2, float64(a.ViewSize.Height)/2, float64(a.ViewSize.Width)/2, float64(a.ViewSize.Height))
  44. borderImagick := imagick.NewMagickWand()
  45. if err := borderImagick.NewImage(a.ViewSize.Width+uint(a.Border), a.ViewSize.Height+uint(a.Border), OpacityPixel()); err != nil {
  46. return nil, util.NewError("borderImagick.NewImage err : ", err.Error())
  47. }
  48. if err := borderImagick.DrawImage(border); err != nil {
  49. return nil, util.NewError("borderImagick.DrawImage err : ", err.Error())
  50. }
  51. avatarImagick := imagick.NewMagickWand()
  52. if err := avatarImagick.ReadImage(a.Src); err != nil {
  53. return nil, util.NewError("avatarImagick.ReadImage err : ", err.Error())
  54. }
  55. if err := avatarImagick.ResizeImage(a.ViewSize.Width-uint(a.Border), a.ViewSize.Height-uint(a.Border), imagick.FILTER_LANCZOS); err != nil {
  56. return nil, util.NewError("avatarImagick.ResizeImage err : ", err.Error())
  57. }
  58. if err := avatarImagick.SetImageFormat("PNG"); err != nil {
  59. return nil, util.NewError("avatarImagick.SetImageFormat err : ", err.Error())
  60. }
  61. if err := borderImagick.CompositeImage(avatarImagick,
  62. imagick.COMPOSITE_OP_OVER,
  63. true, int(a.Border), int(a.Border)); err != nil {
  64. return nil, util.NewError("borderImagick.CompositeImage err : ", err.Error())
  65. }
  66. if a.Angle > 0 {
  67. if err := borderImagick.RotateImage(OpacityPixel(), a.Angle); err != nil {
  68. return nil, util.NewError("qrWM.RotateImage err : ", err.Error())
  69. }
  70. alignX := float64(borderImagick.GetImageWidth()-a.ViewSize.Width) / 2
  71. alignY := float64(borderImagick.GetImageHeight()-a.ViewSize.Height) / 2
  72. a.ViewPoint.X = alignX
  73. a.ViewPoint.Y = alignY
  74. }
  75. return borderImagick, nil
  76. }