package image import ( "fmt" "gopkg.in/gographics/imagick.v3/imagick" "icloudapp.cn/tools/util" fileObj "icloudapp.cn/tools/util/file" ) type Image struct { Basic Path string } // NewImage 创建新的Image对象 func NewImage(path string) *Image { ImageInstance := &Image{ Path: path, } //初始化指针相关数据,避免使用时nil了 ImageInstance.SetSize(0, 0) ImageInstance.SetPoint(0, 0) return ImageInstance } // Create 创建图像 func (i *Image) Create() (*imagick.MagickWand, error) { if i.File != "" { i.File = fmt.Sprintf("%s/%s", i.Path, i.File) if !fileObj.IsFile(i.File) { return nil, util.NewError(fmt.Sprintf("文件 %s 不存在", i.File)) } } imageMW := imagick.NewMagickWand() if i.File != "" { if err := imageMW.ReadImage(i.File); err != nil { return nil, util.NewError(fmt.Sprintf("imageMW.ReadImageBlob:%s", err.Error())) } if err := imageMW.ResizeImage(i.ViewSize.Width, i.ViewSize.Height, imagick.FILTER_LANCZOS); err != nil { return nil, util.NewError(fmt.Sprintf("imageMW.ResizeImage:%s", err.Error())) } } else { if err := imageMW.NewImage(i.ViewSize.Width, i.ViewSize.Height, OpacityPixel()); err != nil { return nil, util.NewError(fmt.Sprintf("imageMW.NewImage:%s", err.Error())) } } if err := imageMW.SetImageFormat("PNG"); err != nil { return nil, util.NewError("imageMW.SetImageFormat", err.Error()) } if i.Background != "" { if err := imageMW.SetImageBackgroundColor(Pixel(i.Background)); err != nil { return nil, util.NewError(fmt.Sprintf("imageMW.SetImageBackgroundColor:%s", err.Error())) } } if i.Angle > 0 { if err := imageMW.RotateImage(OpacityPixel(), i.Angle); err != nil { return nil, util.NewError(fmt.Sprintf("imageMW.RotateImage:%s", err.Error())) } fmt.Println(imageMW.GetImageWidth(), i.ViewSize.Width, imageMW.GetImageHeight(), i.ViewSize.Height) alignX := float64(imageMW.GetImageWidth()-i.ViewSize.Width) / 2 alignY := float64(imageMW.GetImageHeight()-i.ViewSize.Height) / 2 i.SetPoint(i.ViewPoint.X-alignX, i.ViewPoint.Y-alignY) } return imageMW, nil } // Thumb 生成缩略图 func (i *Image) Thumb() (*imagick.MagickWand, error) { if !fileObj.IsFile(i.File) { return nil, util.NewError(fmt.Sprintf("文件 %s 不存在", i.File)) } mw := imagick.NewMagickWand() var err error if err = mw.ReadImage(i.File); err != nil { return nil, util.NewError("mw.ReadImage err :", err.Error()) } width := mw.GetImageWidth() height := mw.GetImageHeight() imageScale := NewScale(width, height, 1.0) scale := imageScale.MinRatio(i.ViewSize.Width, i.ViewSize.Height) if err = mw.ResizeImage(scale.Width, scale.Height, imagick.FILTER_LANCZOS); err != nil { return nil, util.NewError("mw.ResizeImage err :", err.Error()) } return mw, nil } // Cut 裁切图片,先将图片进行按最大比例缩放后再裁切,使裁切的图片显示更多内容 func (i *Image) Cut(position string) (*imagick.MagickWand, error) { if position == "" { position = "left" } mw := imagick.NewMagickWand() if err := mw.ReadImage(i.File); err != nil { return nil, util.NewError("mw.ReadImage err : ", err.Error()) } sourceWidth := mw.GetImageWidth() sourceHeight := mw.GetImageHeight() imageScale := NewScale(sourceWidth, sourceHeight, 1.0) scale := imageScale.MaxRatio(i.ViewSize.Width, i.ViewSize.Height) if err := mw.ResizeImage(scale.Width, scale.Height, imagick.FILTER_LANCZOS); err != nil { return nil, util.NewError("mw.ResizeImage err : ", err.Error()) } x, y, width, height := i.Position(position, scale.Width, scale.Height, i.ViewSize) if err := mw.CropImage(width, height, x, y); err != nil { return nil, util.NewError("mw.CropImage err : ", err.Error()) } return mw, nil } // Resize 缩放 func (i *Image) Resize() (*imagick.MagickWand, error) { imageMV := imagick.NewMagickWand() if err := imageMV.ReadImage(i.File); err != nil { return nil, util.NewError("Resize", "ReadImage", err.Error()) } if err := imageMV.ResizeImage(i.ViewSize.Width, i.ViewSize.Height, imagick.FILTER_LANCZOS); err != nil { return nil, util.NewError("Resize", "ResizeImage", err.Error()) } /* if err := imageMV.SetSize(i.ViewSize.Width, i.ViewSize.Height); err != nil { return nil, util.NewError("Resize", "SetSize", err.Error()) } */ if i.Angle > 0 { if err := imageMV.RotateImage(OpacityPixel(), i.Angle); err != nil { return nil, util.NewError("Resize", "ResizeImage", err.Error()) } alignX := float64(imageMV.GetImageWidth()-i.ViewSize.Width) / 2 alignY := float64(imageMV.GetImageHeight()-i.ViewSize.Height) / 2 i.ViewPoint.X = alignX i.ViewPoint.Y = alignY } return imageMV, nil }