|
@@ -8,169 +8,142 @@ import (
|
|
|
)
|
|
|
|
|
|
type Image struct {
|
|
|
- Cache
|
|
|
+ Basic
|
|
|
Path string
|
|
|
}
|
|
|
|
|
|
+// NewImage 创建新的Image对象
|
|
|
func NewImage(path string) *Image {
|
|
|
- return &Image{
|
|
|
+ ImageInstance := &Image{
|
|
|
Path: path,
|
|
|
}
|
|
|
+ //初始化指针相关数据,避免使用时nil了
|
|
|
+ ImageInstance.SetSize(0, 0)
|
|
|
+ ImageInstance.SetPoint(0, 0)
|
|
|
+ return ImageInstance
|
|
|
}
|
|
|
|
|
|
-func (i *Image) Create(file, background string, size Size) (*imagick.MagickWand, error) {
|
|
|
- if file != "" {
|
|
|
- file = fmt.Sprintf("%s/%s", i.Path, file)
|
|
|
- if !fileObj.IsFile(file) {
|
|
|
- return nil, util.NewError(fmt.Sprintf("文件 %s 不存在", file))
|
|
|
+// 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 file != "" {
|
|
|
- if err := imageMW.ReadImage(file); err != nil {
|
|
|
+ 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.ReadImageBlob(util.TransparentPNG()); err != nil {
|
|
|
- return nil, util.NewError(fmt.Sprintf("imageMW.ReadImageBlob:%s", err.Error()))
|
|
|
+ if err := imageMW.NewImage(i.ViewSize.Width, i.ViewSize.Height, OpacityPixel()); err != nil {
|
|
|
+ return nil, util.NewError(fmt.Sprintf("imageMW.NewImage:%s", err.Error()))
|
|
|
}
|
|
|
}
|
|
|
- fmt.Println("size", size)
|
|
|
if err := imageMW.SetImageFormat("PNG"); err != nil {
|
|
|
return nil, util.NewError("imageMW.SetImageFormat", err.Error())
|
|
|
}
|
|
|
- if err := imageMW.ResizeImage(size.Width, size.Height, imagick.FILTER_LANCZOS); err != nil {
|
|
|
- return nil, util.NewError("imageMW.SetSize", err.Error())
|
|
|
- }
|
|
|
|
|
|
- if background != "" {
|
|
|
- if err := imageMW.SetImageBackgroundColor(Pixel(background)); err != nil {
|
|
|
+ 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
|
|
|
}
|
|
|
|
|
|
-func (i *Image) Thumb(file string, size *Size) (string, error) {
|
|
|
- if !fileObj.IsFile(file) {
|
|
|
- return "", util.NewError(fmt.Sprintf("文件 %s 不存在", file))
|
|
|
+// 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()
|
|
|
- defer mw.Destroy()
|
|
|
|
|
|
var err error
|
|
|
|
|
|
- if err = mw.ReadImage(file); err != nil {
|
|
|
- return "", err
|
|
|
+ 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(size.Width, size.Height)
|
|
|
+ scale := imageScale.MinRatio(i.ViewSize.Width, i.ViewSize.Height)
|
|
|
|
|
|
if err = mw.ResizeImage(scale.Width, scale.Height, imagick.FILTER_LANCZOS); err != nil {
|
|
|
- return "", err
|
|
|
- }
|
|
|
- //fmt.Println("DisplayImage:", os.Getenv("DISPLAY"))
|
|
|
- //err = mw.DisplayImage(os.Getenv("DISPLAY"))
|
|
|
-
|
|
|
- destFile := i.CacheFile(file, mw.GetImageFormat())
|
|
|
- if err = mw.WriteImage(destFile); err != nil {
|
|
|
- return "", err
|
|
|
+ return nil, util.NewError("mw.ResizeImage err :", err.Error())
|
|
|
}
|
|
|
- return destFile, nil
|
|
|
+ return mw, nil
|
|
|
}
|
|
|
|
|
|
-func (i *Image) Cut(file string, size *Size, position string) (string, error) {
|
|
|
+// Cut 裁切图片,先将图片进行按最大比例缩放后再裁切,使裁切的图片显示更多内容
|
|
|
+func (i *Image) Cut(position string) (*imagick.MagickWand, error) {
|
|
|
if position == "" {
|
|
|
position = "left"
|
|
|
}
|
|
|
|
|
|
mw := imagick.NewMagickWand()
|
|
|
- defer mw.Destroy()
|
|
|
- var err error
|
|
|
- err = mw.ReadImage(file)
|
|
|
|
|
|
- if err != nil {
|
|
|
- return "", err
|
|
|
+ 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(size.Width, size.Height)
|
|
|
+ scale := imageScale.MaxRatio(i.ViewSize.Width, i.ViewSize.Height)
|
|
|
|
|
|
- if err = mw.ResizeImage(scale.Width, scale.Height, imagick.FILTER_LANCZOS); err != nil {
|
|
|
- return "", err
|
|
|
+ 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, size)
|
|
|
+ x, y, width, height := i.Position(position, scale.Width, scale.Height, i.ViewSize)
|
|
|
|
|
|
- if err = mw.CropImage(width, height, x, y); err != nil {
|
|
|
- return "", err
|
|
|
+ if err := mw.CropImage(width, height, x, y); err != nil {
|
|
|
+ return nil, util.NewError("mw.CropImage err : ", err.Error())
|
|
|
}
|
|
|
-
|
|
|
- destFile := i.CacheFile(file, mw.GetImageFormat())
|
|
|
- if err = mw.WriteImage(destFile); err != nil {
|
|
|
- return "", err
|
|
|
- }
|
|
|
-
|
|
|
- return destFile, nil
|
|
|
+ return mw, nil
|
|
|
}
|
|
|
|
|
|
-func (i *Image) Resize(image string, width, height uint, angle int) (*imagick.MagickWand, error) {
|
|
|
+// Resize 缩放
|
|
|
+func (i *Image) Resize() (*imagick.MagickWand, error) {
|
|
|
imageMV := imagick.NewMagickWand()
|
|
|
|
|
|
- if err := imageMV.ReadImage(image); err != nil {
|
|
|
+ if err := imageMV.ReadImage(i.File); err != nil {
|
|
|
return nil, util.NewError("Resize", "ReadImage", err.Error())
|
|
|
}
|
|
|
|
|
|
- if err := imageMV.ResizeImage(width, height, imagick.FILTER_LANCZOS); err != nil {
|
|
|
+ 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(width, height); err != nil {
|
|
|
- return nil, util.NewError("Resize", "SetSize", 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
|
|
|
}
|
|
|
-
|
|
|
-// 计算 裁切的x、y及宽高
|
|
|
-func (i *Image) Position(position string, width, height uint, size *Size) (dx, dy int, dWidth, dHeight uint) {
|
|
|
- x := 0
|
|
|
- y := 0
|
|
|
- scale := 1.0
|
|
|
-
|
|
|
- if width < size.Width {
|
|
|
- scale = CustomScale(width, size.Width)
|
|
|
- width = size.Width
|
|
|
- }
|
|
|
- if height < size.Height {
|
|
|
- scale = CustomScale(height, size.Height)
|
|
|
- height = size.Height
|
|
|
- }
|
|
|
- paddingLeft := width - size.Width
|
|
|
- paddingTop := height - size.Height
|
|
|
-
|
|
|
- if position == "right" {
|
|
|
- x = int(paddingLeft)
|
|
|
- }
|
|
|
- if position == "center" {
|
|
|
- x = int(paddingLeft / 2)
|
|
|
- y = int(paddingTop / 2)
|
|
|
- }
|
|
|
-
|
|
|
- if position == "right|center" {
|
|
|
- x = int(paddingLeft)
|
|
|
- y = int(paddingTop / 2)
|
|
|
- }
|
|
|
- if position == "left|center" {
|
|
|
- y = int(paddingTop / 2)
|
|
|
- }
|
|
|
- return x, y, uint(float64(size.Width) * scale), uint(float64(size.Height) * scale)
|
|
|
-}
|