func (p *Poster) Create2(json PosterJson) (string, error) { cachePath := fmt.Sprintf("%s/cache", util.Getwd()) image := NewImage(util.Getwd()) image.SetCache(cachePath) if json.Use == "bgUrl" { json.Background = "" } if json.Use == "bgc" { json.BackgroundUrl = "" } poster, err := image.Create(json.BackgroundUrl, json.Background, *NewSize(json.Width, json.Height)) if err != nil { return "", err } defer poster.Destroy() itemLen := len(json.Items) destChan := make(chan *PosterMW, itemLen) defer close(destChan) for index, item := range json.Items { go func(item Items, index int) { var drawErr error var drawMW *gmagick.MagickWand var updated Items if item.Type == "text" { drawMW, updated, drawErr = p.Text(item) } if item.Type == "image" { drawMW, drawErr = image.Resize(item.Value, item.Width, item.Height, item.Angle) } if item.Type == "qrcode" { drawMW, updated, drawErr = p.QRCode(item) } destChan <- &PosterMW{Index: index, Image: drawMW, Item: updated, Err: drawErr} }(item, index) } var response = make([]*PosterMW, itemLen) for i := 0; i < len(json.Items); i++ { res := <-destChan response[res.Index] = res } for i := 0; i < len(response); i++ { draw := response[i].Image errDraw := response[i].Err if errDraw != nil { continue } if errComposite := poster.CompositeImage(draw, gmagick.COMPOSITE_OP_OVER, response[i].Item.X, response[i].Item.Y); errComposite != nil { fmt.Println("poster.CompositeImage text err : ", errComposite.Error()) continue } } destFile := image.CacheFile("preview-poster", poster.GetImageFormat()) err = poster.WriteImage(destFile) if err != nil { return "", err } return destFile, nil } func (p *Poster) Create1(json PosterJson) (string, error) { cachePath := fmt.Sprintf("%s/cache", util.Getwd()) image := NewImage(util.Getwd()) image.SetCache(cachePath) if json.Use == "bgUrl" { json.Background = "" } if json.Use == "bgc" { json.BackgroundUrl = "" } poster, err := image.Create(json.BackgroundUrl, json.Background, *NewSize(json.Width, json.Height)) if err != nil { return "", err } defer poster.Destroy() for _, item := range json.Items { if item.Type == "text" { drawText, _, errTxt := p.Text(item) if errTxt != nil { fmt.Println("drawText err: ", errTxt.Error()) continue } if errComposite := poster.CompositeImage(drawText, gmagick.COMPOSITE_OP_OVER, item.X, item.Y); errComposite != nil { fmt.Println("poster.CompositeImage text err : ", errComposite.Error()) continue } } if item.Type == "image" { imageMW, errImage := image.Resize(item.Value, item.Width, item.Height, item.Angle) if errImage != nil { continue } if errComposite := poster.CompositeImage(imageMW, gmagick.COMPOSITE_OP_OVER, item.X, item.Y); errComposite != nil { fmt.Println("poster.CompositeImage image err : ", errComposite.Error()) continue } } if item.Type == "qrcode" { qrWM, _, errQr := p.QRCode(item) if errQr != nil { fmt.Println("Qr err", errQr.Error()) continue } if errComposite := poster.CompositeImage(qrWM, gmagick.COMPOSITE_OP_OVER, item.X, item.Y); errComposite != nil { fmt.Println("poster.CompositeImage qr err : ", errComposite.Error()) continue } } } //util.RandomStr(10); destFile := image.CacheFile("preview-poster", poster.GetImageFormat()) err = poster.WriteImage(destFile) if err != nil { return "", err } return destFile, nil }