Browse Source

Update ; 将gmagick更换为 imagick

朱金辉 2 years ago
parent
commit
26389756f7
8 changed files with 56 additions and 65 deletions
  1. 2 5
      controller/poster.go
  2. 3 3
      main.go
  3. 4 5
      util/image/color.go
  4. 6 0
      util/image/font.go
  5. 11 26
      util/image/image.go
  6. 7 7
      util/image/poster.go
  7. 3 3
      util/image/qr.go
  8. 20 16
      util/image/text.go

+ 2 - 5
controller/poster.go

@@ -21,9 +21,6 @@ func Preview(ctx *gin.Context) {
 
 	path, _ := os.Getwd()
 
-	gmagick.Initialize()
-	defer gmagick.Terminate()
-
 	thumb := image.NewImage(setting.Conf.CacheDir)
 	file, err := thumb.Thumb(fmt.Sprintf("%s/%s", path, file), image.NewSize(300, 300))
 
@@ -75,7 +72,7 @@ func Image(ctx *gin.Context) {
 		return
 	}
 	//不写入文件,直接返回给浏览器
-	_, err = ctx.Writer.Write(file.WriteImageBlob())
+	_, err = ctx.Writer.Write(file.GetImageBlob())
 	if err != nil {
 		ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("ctx.Writer.Write err: %s", err.Error()), []interface{}{})
 		return
@@ -191,7 +188,7 @@ func DrawImage(ctx *gin.Context) {
 	}
 
 	//不写入文件,直接返回给浏览器
-	_, err = ctx.Writer.Write(file.WriteImageBlob())
+	_, err = ctx.Writer.Write(file.GetImageBlob())
 	if err != nil {
 		ResponseNormal(ctx, entity.CodeSystemError, fmt.Sprintf("ctx.Writer.Write err: %s", err.Error()), []interface{}{})
 		return

+ 3 - 3
main.go

@@ -3,7 +3,7 @@ package main
 import (
 	"fmt"
 	"github.com/gin-gonic/gin"
-	"github.com/gographics/gmagick"
+	"gopkg.in/gographics/imagick.v3/imagick"
 	"os"
 
 	setting "icloudapp.cn/tools/config"
@@ -23,8 +23,8 @@ func main() {
 	setting.Init(os.Args[1])
 	*/
 
-	gmagick.Initialize()
-	defer gmagick.Terminate()
+	imagick.Initialize()
+	defer imagick.Terminate()
 
 	gin.SetMode(gin.DebugMode)
 	setting.Init(gin.EnvGinMode)

+ 4 - 5
util/image/color.go

@@ -2,7 +2,7 @@ package image
 
 import (
 	"fmt"
-	"github.com/gographics/gmagick"
+	"gopkg.in/gographics/imagick.v3/imagick"
 	"icloudapp.cn/tools/util"
 	"strconv"
 	"strings"
@@ -92,10 +92,9 @@ func Alpha(color string) (string, Color, float64) {
 }
 
 // Pixel PixelWand
-func Pixel(color string) *gmagick.PixelWand {
-	destColor, _, opacity := Alpha(color)
-	g := gmagick.NewPixelWand()
+func Pixel(color string) *imagick.PixelWand {
+	destColor, _, _ := Alpha(color)
+	g := imagick.NewPixelWand()
 	g.SetColor(destColor)
-	g.SetOpacity(opacity)
 	return g
 }

+ 6 - 0
util/image/font.go

@@ -1 +1,7 @@
 package image
+
+type Font struct {
+	Font     string
+	FontSize float64
+	Family   string
+}

+ 11 - 26
util/image/image.go

@@ -2,7 +2,7 @@ package image
 
 import (
 	"fmt"
-	"github.com/gographics/gmagick"
+	"gopkg.in/gographics/imagick.v3/imagick"
 	"icloudapp.cn/tools/util"
 	fileObj "icloudapp.cn/tools/util/file"
 )
@@ -18,14 +18,14 @@ func NewImage(path string) *Image {
 	}
 }
 
-func (i *Image) Create(file, background string, size Size) (*gmagick.MagickWand, error) {
+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))
 		}
 	}
-	imageMW := gmagick.NewMagickWand()
+	imageMW := imagick.NewMagickWand()
 
 	if file != "" {
 		if err := imageMW.ReadImage(file); err != nil {
@@ -40,7 +40,7 @@ func (i *Image) Create(file, background string, size Size) (*gmagick.MagickWand,
 	if err := imageMW.SetImageFormat("PNG"); err != nil {
 		return nil, util.NewError("imageMW.SetImageFormat", err.Error())
 	}
-	if err := imageMW.ResizeImage(size.Width, size.Height, gmagick.FILTER_LANCZOS, 1); err != nil {
+	if err := imageMW.ResizeImage(size.Width, size.Height, imagick.FILTER_LANCZOS); err != nil {
 		return nil, util.NewError("imageMW.SetSize", err.Error())
 	}
 
@@ -58,7 +58,7 @@ func (i *Image) Thumb(file string, size *Size) (string, error) {
 		return "", util.NewError(fmt.Sprintf("文件 %s 不存在", file))
 	}
 
-	mw := gmagick.NewMagickWand()
+	mw := imagick.NewMagickWand()
 	defer mw.Destroy()
 
 	var err error
@@ -73,7 +73,7 @@ func (i *Image) Thumb(file string, size *Size) (string, error) {
 	imageScale := NewScale(width, height, 1.0)
 	scale := imageScale.MinRatio(size.Width, size.Height)
 
-	if err = mw.ResizeImage(scale.Width, scale.Height, gmagick.FILTER_LANCZOS, 1); err != nil {
+	if err = mw.ResizeImage(scale.Width, scale.Height, imagick.FILTER_LANCZOS); err != nil {
 		return "", err
 	}
 	//fmt.Println("DisplayImage:", os.Getenv("DISPLAY"))
@@ -91,7 +91,7 @@ func (i *Image) Cut(file string, size *Size, position string) (string, error) {
 		position = "left"
 	}
 
-	mw := gmagick.NewMagickWand()
+	mw := imagick.NewMagickWand()
 	defer mw.Destroy()
 	var err error
 	err = mw.ReadImage(file)
@@ -105,7 +105,7 @@ func (i *Image) Cut(file string, size *Size, position string) (string, error) {
 
 	scale := imageScale.MaxRatio(size.Width, size.Height)
 
-	if err = mw.ResizeImage(scale.Width, scale.Height, gmagick.FILTER_LANCZOS, 1); err != nil {
+	if err = mw.ResizeImage(scale.Width, scale.Height, imagick.FILTER_LANCZOS); err != nil {
 		return "", err
 	}
 	x, y, width, height := i.Position(position, scale.Width, scale.Height, size)
@@ -122,14 +122,14 @@ func (i *Image) Cut(file string, size *Size, position string) (string, error) {
 	return destFile, nil
 }
 
-func (i *Image) Resize(image string, width, height uint, angle int) (*gmagick.MagickWand, error) {
-	imageMV := gmagick.NewMagickWand()
+func (i *Image) Resize(image string, width, height uint, angle int) (*imagick.MagickWand, error) {
+	imageMV := imagick.NewMagickWand()
 
 	if err := imageMV.ReadImage(image); err != nil {
 		return nil, util.NewError("Resize", "ReadImage", err.Error())
 	}
 
-	if err := imageMV.ResizeImage(width, height, gmagick.FILTER_LANCZOS, 1); err != nil {
+	if err := imageMV.ResizeImage(width, height, imagick.FILTER_LANCZOS); err != nil {
 		return nil, util.NewError("Resize", "ResizeImage", err.Error())
 	}
 
@@ -174,18 +174,3 @@ func (i *Image) Position(position string, width, height uint, size *Size) (dx, d
 	}
 	return x, y, uint(float64(size.Width) * scale), uint(float64(size.Height) * scale)
 }
-
-// Cache 获取缓存文件名
-/*func (i *Image) CacheFile(file string, format string) string {
-	if !fileObj.IsDir(i.Cache) {
-		if err := os.Mkdir(i.Cache, 0755); err != nil {
-			panic(err.Error())
-		}
-	}
-	if file == "" {
-		file = util.RandomStr(10)
-	}
-	destName := fmt.Sprintf("%x", md5.Sum([]byte(file)))
-	destFile := fmt.Sprintf("%s/%s.%s", i.Cache, destName, strings.ToLower(format))
-	return destFile
-}*/

+ 7 - 7
util/image/poster.go

@@ -3,7 +3,7 @@ package image
 import (
 	"context"
 	"fmt"
-	"github.com/gographics/gmagick"
+	"gopkg.in/gographics/imagick.v3/imagick"
 	"icloudapp.cn/tools/util"
 	"strings"
 )
@@ -16,7 +16,7 @@ func NewPoster(ctx context.Context) *Poster {
 	return &Poster{ctx: ctx}
 }
 
-func (p *Poster) Text(item Items) (*gmagick.MagickWand, Items, error) {
+func (p *Poster) Text(item Items) (*imagick.MagickWand, Items, error) {
 	var updated Items
 	item.Value = strings.Replace(item.Value, "  ", " ", -1)
 	txt := NewText(item.Font, float64(item.Size), "")
@@ -41,7 +41,7 @@ func (p *Poster) Text(item Items) (*gmagick.MagickWand, Items, error) {
 	return mw, updated, err
 }
 
-func (p *Poster) QRCode(item Items) (*gmagick.MagickWand, Items, error) {
+func (p *Poster) QRCode(item Items) (*imagick.MagickWand, Items, error) {
 	var updated Items
 	cachePath := fmt.Sprintf("%s/cache", util.Getwd())
 	qr := NewQR()
@@ -58,12 +58,12 @@ func (p *Poster) QRCode(item Items) (*gmagick.MagickWand, Items, error) {
 
 type PosterMW struct {
 	Index int
-	Image *gmagick.MagickWand
+	Image *imagick.MagickWand
 	Item  Items
 	Err   error
 }
 
-func (p *Poster) Create(json PosterJson) (*gmagick.MagickWand, error) {
+func (p *Poster) Create(json PosterJson) (*imagick.MagickWand, error) {
 	cachePath := fmt.Sprintf("%s/cache", util.Getwd())
 	image := NewImage(util.Getwd())
 	image.SetCache(cachePath)
@@ -87,7 +87,7 @@ func (p *Poster) Create(json PosterJson) (*gmagick.MagickWand, error) {
 	for index, item := range json.Items {
 		go func(item Items, index int) {
 			var drawErr error
-			var drawMW *gmagick.MagickWand
+			var drawMW *imagick.MagickWand
 			if item.Type == "text" {
 				drawMW, item, drawErr = p.Text(item)
 			}
@@ -115,7 +115,7 @@ func (p *Poster) Create(json PosterJson) (*gmagick.MagickWand, error) {
 		if response[i].Item.Type == "text" {
 			fmt.Println(fmt.Sprintf("response[i].Item : %+v", response[i].Item))
 		}
-		if errComposite := poster.CompositeImage(draw, gmagick.COMPOSITE_OP_OVER, response[i].Item.X, response[i].Item.Y); errComposite != nil {
+		if errComposite := poster.CompositeImage(draw, imagick.COMPOSITE_OP_OVER, true, response[i].Item.X, response[i].Item.Y); errComposite != nil {
 			fmt.Println("poster.CompositeImage text err : ", errComposite.Error())
 			continue
 		}

+ 3 - 3
util/image/qr.go

@@ -2,8 +2,8 @@ package image
 
 import (
 	"fmt"
-	"github.com/gographics/gmagick"
 	"github.com/skip2/go-qrcode"
+	"gopkg.in/gographics/imagick.v3/imagick"
 	"icloudapp.cn/tools/util"
 	"image/color"
 	"sync"
@@ -45,7 +45,7 @@ func (q *QR) SetBackgroundColor(backgroundColor string) {
 func (q *QR) SetSize(width, height uint) {
 	q.QRSize = NewSize(width, height)
 }
-func (q *QR) Create() (*gmagick.MagickWand, error) {
+func (q *QR) Create() (*imagick.MagickWand, error) {
 	//file := fmt.Sprintf("%s.png", util.Sign(q.Value, "QR"))
 	file := q.CacheFile(util.Sign(q.Value, "QR"), "png")
 	if q.BackgroundColor == "" {
@@ -89,7 +89,7 @@ func (q *QR) Create() (*gmagick.MagickWand, error) {
 		return nil, util.NewError("qrcode.WriteColorFile", err.Error())
 	}*/
 
-	qrWM := gmagick.NewMagickWand()
+	qrWM := imagick.NewMagickWand()
 	if err = qrWM.ReadImage(file); err != nil {
 		return nil, util.NewError("qrWM.SetImageFilename", err.Error())
 	}

+ 20 - 16
util/image/text.go

@@ -2,7 +2,7 @@ package image
 
 import (
 	"fmt"
-	"github.com/gographics/gmagick"
+	"gopkg.in/gographics/imagick.v3/imagick"
 	"icloudapp.cn/tools/util"
 	"strings"
 )
@@ -145,10 +145,12 @@ func (t *Text) SetAngle(angle int64) {
 	t.Angle = angle
 }
 
-func (t *Text) Create() (*gmagick.MagickWand, error) {
-	txtDraw := gmagick.NewDrawingWand()
+func (t *Text) Create() (*imagick.MagickWand, error) {
+	txtDraw := imagick.NewDrawingWand()
 	if t.Font != "" {
-		txtDraw.SetFont(fmt.Sprintf("upload/fonts/%s", t.Font))
+		if err := txtDraw.SetFont(fmt.Sprintf("upload/fonts/%s", t.Font)); err != nil {
+			return nil, util.NewError("txtDraw.SetFont", err.Error())
+		}
 	}
 
 	if t.FontSize == 0 {
@@ -158,7 +160,9 @@ func (t *Text) Create() (*gmagick.MagickWand, error) {
 	txtDraw.SetFontSize(t.FontSize)
 
 	if t.FontFamily != "" {
-		txtDraw.SetFontFamily(t.FontFamily)
+		if err := txtDraw.SetFontFamily(t.FontFamily); err != nil {
+			return nil, util.NewError("txtDraw.SetFont", err.Error())
+		}
 	}
 	if t.Color != "" {
 		tColor := Pixel(t.Color)
@@ -174,14 +178,14 @@ func (t *Text) Create() (*gmagick.MagickWand, error) {
 		txtDraw.SkewX(-12)
 	}
 
-	txtDraw.SetFontStyle(gmagick.STYLE_NORMAL)
+	txtDraw.SetFontStyle(imagick.STYLE_NORMAL)
 	if t.Bold {
 		//txtDraw.SetStrokeWidth(1)
-		txtDraw.SetFontStyle(gmagick.STYLE_OBLIQUE)
+		txtDraw.SetFontStyle(imagick.STYLE_OBLIQUE)
 	}
 
 	if t.UnderLine {
-		txtDraw.SetTextDecoration(gmagick.DECORATION_UNDERLINE)
+		txtDraw.SetTextDecoration(imagick.DECORATION_UNDERLINE)
 	}
 
 	if t.Background != "" {
@@ -198,7 +202,7 @@ func (t *Text) Create() (*gmagick.MagickWand, error) {
 
 	//透明图片
 	transPNG := util.TransparentPNG()
-	subMw := gmagick.NewMagickWand()
+	subMw := imagick.NewMagickWand()
 
 	if err := subMw.ReadImageBlob(transPNG); err != nil {
 		return nil, util.NewError("subMw.ReadImageBlob", err.Error())
@@ -207,7 +211,7 @@ func (t *Text) Create() (*gmagick.MagickWand, error) {
 	if err := subMw.SetImageFormat("PNG"); err != nil {
 		return nil, util.NewError("subMw.SetImageFormat", err.Error())
 	}
-	if err := subMw.ResizeImage(t.ViewSize.Width, t.ViewSize.Height, gmagick.FILTER_LANCZOS, 1); err != nil {
+	if err := subMw.ResizeImage(t.ViewSize.Width, t.ViewSize.Height, imagick.FILTER_LANCZOS); err != nil {
 		return nil, util.NewError("subMw.ResizeImage", err.Error())
 	}
 
@@ -223,7 +227,7 @@ func (t *Text) Create() (*gmagick.MagickWand, error) {
 
 	if t.Strike {
 		txtDraw.SetStrokeDashOffset(metrics.TextHeight)
-		txtDraw.SetTextDecoration(gmagick.DECORATION_LINE_THROUGH)
+		txtDraw.SetTextDecoration(imagick.DECORATION_LINE_THROUGH)
 	}
 
 	txtDraw.Annotation(alignX, metrics.Ascender, t.Text)
@@ -236,19 +240,19 @@ func (t *Text) Create() (*gmagick.MagickWand, error) {
 		return nil, util.NewError("subMw.DrawImage", err.Error())
 	}
 
-	parentMw := gmagick.NewMagickWand()
+	parentMw := imagick.NewMagickWand()
 
 	if err := parentMw.ReadImageBlob(transPNG); err != nil {
 		return nil, util.NewError("parentMw.ReadImageBlob", err.Error())
 	}
-	if err := parentMw.ResizeImage(t.ViewSize.Width, t.ViewSize.Height, gmagick.FILTER_LANCZOS, 1); err != nil {
+	if err := parentMw.ResizeImage(t.ViewSize.Width, t.ViewSize.Height, imagick.FILTER_LANCZOS); err != nil {
 		return nil, util.NewError("subMw.ResizeImage", err.Error())
 	}
 	if err := parentMw.SetSize(t.ViewSize.Width, t.ViewSize.Height); err != nil {
 		return nil, util.NewError("subMw.SetSize", err.Error())
 	}
 
-	if err := parentMw.CompositeImage(subMw, gmagick.COMPOSITE_OP_OVER, 0, 0); err != nil {
+	if err := parentMw.CompositeImage(subMw, imagick.COMPOSITE_OP_OVER, true, 0, 0); err != nil {
 		return nil, util.NewError("parentMw.CompositeImage ", err.Error())
 	}
 	pixBackground := Pixel("#ffffffff")
@@ -270,8 +274,8 @@ func (t *Text) Create() (*gmagick.MagickWand, error) {
 	return parentMw, nil
 }
 
-func (t *Text) WapText(dw *gmagick.DrawingWand, text string, autoWrap bool) []string {
-	queryMw := gmagick.NewMagickWand()
+func (t *Text) WapText(dw *imagick.DrawingWand, text string, autoWrap bool) []string {
+	queryMw := imagick.NewMagickWand()
 	metrics := queryMw.QueryFontMetrics(dw, t.Text)
 	fmt.Println("metrics", metrics)
 	var lines []string