image.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package image
  2. import (
  3. "fmt"
  4. "gopkg.in/gographics/imagick.v3/imagick"
  5. "icloudapp.cn/tools/util"
  6. fileObj "icloudapp.cn/tools/util/file"
  7. )
  8. type Image struct {
  9. Basic
  10. Path string
  11. }
  12. // NewImage 创建新的Image对象
  13. func NewImage(path string) *Image {
  14. ImageInstance := &Image{
  15. Path: path,
  16. }
  17. //初始化指针相关数据,避免使用时nil了
  18. ImageInstance.SetSize(0, 0)
  19. ImageInstance.SetPoint(0, 0)
  20. return ImageInstance
  21. }
  22. // Create 创建图像
  23. func (i *Image) Create() (*imagick.MagickWand, error) {
  24. if i.File != "" {
  25. i.File = fmt.Sprintf("%s/%s", i.Path, i.File)
  26. if !fileObj.IsFile(i.File) {
  27. return nil, util.NewError(fmt.Sprintf("文件 %s 不存在", i.File))
  28. }
  29. }
  30. imageMW := imagick.NewMagickWand()
  31. if i.File != "" {
  32. if err := imageMW.ReadImage(i.File); err != nil {
  33. return nil, util.NewError(fmt.Sprintf("imageMW.ReadImageBlob:%s", err.Error()))
  34. }
  35. if err := imageMW.ResizeImage(i.ViewSize.Width, i.ViewSize.Height, imagick.FILTER_LANCZOS); err != nil {
  36. return nil, util.NewError(fmt.Sprintf("imageMW.ResizeImage:%s", err.Error()))
  37. }
  38. } else {
  39. if err := imageMW.NewImage(i.ViewSize.Width, i.ViewSize.Height, OpacityPixel()); err != nil {
  40. return nil, util.NewError(fmt.Sprintf("imageMW.NewImage:%s", err.Error()))
  41. }
  42. }
  43. if err := imageMW.SetImageFormat("PNG"); err != nil {
  44. return nil, util.NewError("imageMW.SetImageFormat", err.Error())
  45. }
  46. if i.Background != "" {
  47. if err := imageMW.SetImageBackgroundColor(Pixel(i.Background)); err != nil {
  48. return nil, util.NewError(fmt.Sprintf("imageMW.SetImageBackgroundColor:%s", err.Error()))
  49. }
  50. }
  51. if i.Angle > 0 {
  52. if err := imageMW.RotateImage(OpacityPixel(), i.Angle); err != nil {
  53. return nil, util.NewError(fmt.Sprintf("imageMW.RotateImage:%s", err.Error()))
  54. }
  55. fmt.Println(imageMW.GetImageWidth(), i.ViewSize.Width, imageMW.GetImageHeight(), i.ViewSize.Height)
  56. alignX := float64(imageMW.GetImageWidth()-i.ViewSize.Width) / 2
  57. alignY := float64(imageMW.GetImageHeight()-i.ViewSize.Height) / 2
  58. i.SetPoint(i.ViewPoint.X-alignX, i.ViewPoint.Y-alignY)
  59. }
  60. return imageMW, nil
  61. }
  62. // Thumb 生成缩略图
  63. func (i *Image) Thumb() (*imagick.MagickWand, error) {
  64. if !fileObj.IsFile(i.File) {
  65. return nil, util.NewError(fmt.Sprintf("文件 %s 不存在", i.File))
  66. }
  67. mw := imagick.NewMagickWand()
  68. var err error
  69. if err = mw.ReadImage(i.File); err != nil {
  70. return nil, util.NewError("mw.ReadImage err :", err.Error())
  71. }
  72. width := mw.GetImageWidth()
  73. height := mw.GetImageHeight()
  74. imageScale := NewScale(width, height, 1.0)
  75. scale := imageScale.MinRatio(i.ViewSize.Width, i.ViewSize.Height)
  76. if err = mw.ResizeImage(scale.Width, scale.Height, imagick.FILTER_LANCZOS); err != nil {
  77. return nil, util.NewError("mw.ResizeImage err :", err.Error())
  78. }
  79. return mw, nil
  80. }
  81. // Cut 裁切图片,先将图片进行按最大比例缩放后再裁切,使裁切的图片显示更多内容
  82. func (i *Image) Cut(position string) (*imagick.MagickWand, error) {
  83. if position == "" {
  84. position = "left"
  85. }
  86. mw := imagick.NewMagickWand()
  87. if err := mw.ReadImage(i.File); err != nil {
  88. return nil, util.NewError("mw.ReadImage err : ", err.Error())
  89. }
  90. sourceWidth := mw.GetImageWidth()
  91. sourceHeight := mw.GetImageHeight()
  92. imageScale := NewScale(sourceWidth, sourceHeight, 1.0)
  93. scale := imageScale.MaxRatio(i.ViewSize.Width, i.ViewSize.Height)
  94. if err := mw.ResizeImage(scale.Width, scale.Height, imagick.FILTER_LANCZOS); err != nil {
  95. return nil, util.NewError("mw.ResizeImage err : ", err.Error())
  96. }
  97. x, y, width, height := i.Position(position, scale.Width, scale.Height, i.ViewSize)
  98. if err := mw.CropImage(width, height, x, y); err != nil {
  99. return nil, util.NewError("mw.CropImage err : ", err.Error())
  100. }
  101. return mw, nil
  102. }
  103. // Resize 缩放
  104. func (i *Image) Resize() (*imagick.MagickWand, error) {
  105. imageMV := imagick.NewMagickWand()
  106. if err := imageMV.ReadImage(i.File); err != nil {
  107. return nil, util.NewError("Resize", "ReadImage", err.Error())
  108. }
  109. if err := imageMV.ResizeImage(i.ViewSize.Width, i.ViewSize.Height, imagick.FILTER_LANCZOS); err != nil {
  110. return nil, util.NewError("Resize", "ResizeImage", err.Error())
  111. }
  112. /*
  113. if err := imageMV.SetSize(i.ViewSize.Width, i.ViewSize.Height); err != nil {
  114. return nil, util.NewError("Resize", "SetSize", err.Error())
  115. }
  116. */
  117. if i.Angle > 0 {
  118. if err := imageMV.RotateImage(OpacityPixel(), i.Angle); err != nil {
  119. return nil, util.NewError("Resize", "ResizeImage", err.Error())
  120. }
  121. alignX := float64(imageMV.GetImageWidth()-i.ViewSize.Width) / 2
  122. alignY := float64(imageMV.GetImageHeight()-i.ViewSize.Height) / 2
  123. i.ViewPoint.X = alignX
  124. i.ViewPoint.Y = alignY
  125. }
  126. return imageMV, nil
  127. }