image.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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.ViewSize.Width == 0 || i.ViewSize.Height == 0 {
  25. return nil, util.NewError("Create Text", "指定元素未设置长宽")
  26. }
  27. if i.File != "" {
  28. i.File = fmt.Sprintf("%s/%s", i.Path, i.File)
  29. if !fileObj.IsFile(i.File) {
  30. return nil, util.NewError(fmt.Sprintf("文件 %s 不存在", i.File))
  31. }
  32. }
  33. imageMW := imagick.NewMagickWand()
  34. if i.File != "" {
  35. if err := imageMW.ReadImage(i.File); err != nil {
  36. return nil, util.NewError(fmt.Sprintf("imageMW.ReadImageBlob:%s", err.Error()))
  37. }
  38. if err := imageMW.ResizeImage(i.ViewSize.Width, i.ViewSize.Height, imagick.FILTER_LANCZOS); err != nil {
  39. return nil, util.NewError(fmt.Sprintf("imageMW.ResizeImage:%s", err.Error()))
  40. }
  41. } else {
  42. if err := imageMW.NewImage(i.ViewSize.Width, i.ViewSize.Height, OpacityPixel()); err != nil {
  43. return nil, util.NewError(fmt.Sprintf("imageMW.NewImage:%s", err.Error()))
  44. }
  45. }
  46. if err := imageMW.SetImageFormat("PNG"); err != nil {
  47. return nil, util.NewError("imageMW.SetImageFormat", err.Error())
  48. }
  49. if i.Background != "" {
  50. if err := imageMW.SetImageBackgroundColor(Pixel(i.Background)); err != nil {
  51. return nil, util.NewError(fmt.Sprintf("imageMW.SetImageBackgroundColor:%s", err.Error()))
  52. }
  53. }
  54. if i.Angle > 0 {
  55. if err := imageMW.RotateImage(OpacityPixel(), i.Angle); err != nil {
  56. return nil, util.NewError(fmt.Sprintf("imageMW.RotateImage:%s", err.Error()))
  57. }
  58. fmt.Println("imageMW.GetImageWidth", imageMW.GetImageWidth(), i.ViewSize.Width, imageMW.GetImageHeight(), i.ViewSize.Height)
  59. alignX := float64(imageMW.GetImageWidth()-i.ViewSize.Width) / 2
  60. alignY := float64(imageMW.GetImageHeight()-i.ViewSize.Height) / 2
  61. i.SetPoint(i.ViewPoint.X-alignX, i.ViewPoint.Y-alignY)
  62. }
  63. return imageMW, nil
  64. }
  65. // Thumb 生成缩略图
  66. func (i *Image) Thumb() (*imagick.MagickWand, error) {
  67. if !fileObj.IsFile(i.File) {
  68. return nil, util.NewError(fmt.Sprintf("文件 %s 不存在", i.File))
  69. }
  70. mw := imagick.NewMagickWand()
  71. var err error
  72. if err = mw.ReadImage(i.File); err != nil {
  73. return nil, util.NewError("mw.ReadImage err :", err.Error())
  74. }
  75. width := mw.GetImageWidth()
  76. height := mw.GetImageHeight()
  77. imageScale := NewScale(width, height, 1.0)
  78. scale := imageScale.MinRatio(i.ViewSize.Width, i.ViewSize.Height)
  79. if err = mw.ResizeImage(scale.Width, scale.Height, imagick.FILTER_LANCZOS); err != nil {
  80. return nil, util.NewError("mw.ResizeImage err :", err.Error())
  81. }
  82. return mw, nil
  83. }
  84. // Cut 裁切图片,先将图片进行按最大比例缩放后再裁切,使裁切的图片显示更多内容
  85. func (i *Image) Cut(position string) (*imagick.MagickWand, error) {
  86. if position == "" {
  87. position = "left"
  88. }
  89. mw := imagick.NewMagickWand()
  90. if err := mw.ReadImage(i.File); err != nil {
  91. return nil, util.NewError("mw.ReadImage err : ", err.Error())
  92. }
  93. sourceWidth := mw.GetImageWidth()
  94. sourceHeight := mw.GetImageHeight()
  95. imageScale := NewScale(sourceWidth, sourceHeight, 1.0)
  96. scale := imageScale.MaxRatio(i.ViewSize.Width, i.ViewSize.Height)
  97. if err := mw.ResizeImage(scale.Width, scale.Height, imagick.FILTER_LANCZOS); err != nil {
  98. return nil, util.NewError("mw.ResizeImage err : ", err.Error())
  99. }
  100. x, y, width, height := i.Position(position, scale.Width, scale.Height, i.ViewSize)
  101. if err := mw.CropImage(width, height, x, y); err != nil {
  102. return nil, util.NewError("mw.CropImage err : ", err.Error())
  103. }
  104. return mw, nil
  105. }
  106. // Resize 缩放
  107. func (i *Image) Resize() (*imagick.MagickWand, error) {
  108. imageMV := imagick.NewMagickWand()
  109. if err := imageMV.ReadImage(i.File); err != nil {
  110. return nil, util.NewError("Resize", "ReadImage", err.Error())
  111. }
  112. if err := imageMV.ResizeImage(i.ViewSize.Width, i.ViewSize.Height, imagick.FILTER_LANCZOS); err != nil {
  113. return nil, util.NewError("Resize", "ResizeImage", err.Error())
  114. }
  115. /*
  116. if err := imageMV.SetSize(i.ViewSize.Width, i.ViewSize.Height); err != nil {
  117. return nil, util.NewError("Resize", "SetSize", err.Error())
  118. }
  119. */
  120. if i.Angle > 0 {
  121. if err := imageMV.RotateImage(OpacityPixel(), i.Angle); err != nil {
  122. return nil, util.NewError("Resize", "ResizeImage", err.Error())
  123. }
  124. alignX := float64(imageMV.GetImageWidth()-i.ViewSize.Width) / 2
  125. alignY := float64(imageMV.GetImageHeight()-i.ViewSize.Height) / 2
  126. i.ViewPoint.X = alignX
  127. i.ViewPoint.Y = alignY
  128. }
  129. return imageMV, nil
  130. }