在网上搜集了很多资料,自己做了一个工具,可应用于生产环境。
目的:拼接图片合成,在图片模板上合成
import (
"fmt"
"image"
"image/draw"
"image/jpeg"
"os"
log "github.com/sirupsen/logrus"
)
func MergeImg(img map[int]int) error {
var centerImg1, centerImg2, centerImg3, centerImg4 image.Image
//背景图
backgroundImgFile, _ := os.Open("./static/print/temple.jpg")
backgroundImg, _ := jpeg.Decode(backgroundImgFile)
defer backgroundImgFile.Close()
backgroundBound := backgroundImg.Bounds()
//x轴坐标总数
//backgroundX := backgroundBound.Size().X
//y轴坐标总数
//backgroundY := backgroundBound.Size().Y
//添加图,第一张图片,如果是windows 换成c:/1.jpg
if pid1, ok := img[1]; ok {
centerImgFile1, _ := os.Open(fmt.Sprintf("./static/merge/%d-m.jpg", pid1))
centerImg1, _ = jpeg.Decode(centerImgFile1)
defer centerImgFile1.Close()
} else {
centerImgFile1, _ := os.Open("./static/image/white.jpg")
centerImg1, _ = jpeg.Decode(centerImgFile1)
defer centerImgFile1.Close()
}
//centerBound := centerImg.Bounds()
//x轴坐标总数
//centerX := centerBound.Size().X
//y轴坐标总数
//centerY := centerBound.Size().Y
//坐标偏差,x轴y轴 计算
//newImgX := (backgroundX - centerX) / 2
//newImgY := (backgroundY - centerY) / 2
//第二张图片
if pid2, ok := img[2]; ok {
centerImgFile2, _ := os.Open(fmt.Sprintf("./static/merge/%d-m.jpg", pid2))
centerImg2, _ = jpeg.Decode(centerImgFile2)
defer centerImgFile2.Close()
} else {
centerImgFile2, _ := os.Open("./static/image/white.jpg")
centerImg2, _ = jpeg.Decode(centerImgFile2)
defer centerImgFile2.Close()
}
//第三张图片
if pid3, ok := img[3]; ok {
centerImgFile3, _ := os.Open(fmt.Sprintf("./static/merge/%d-m.jpg", pid3))
centerImg3, _ = jpeg.Decode(centerImgFile3)
defer centerImgFile3.Close()
} else {
centerImgFile3, _ := os.Open("./static/image/white.jpg")
centerImg3, _ = jpeg.Decode(centerImgFile3)
defer centerImgFile3.Close()
}
//第四张图片
if pid4, ok := img[4]; ok {
centerImgFile4, _ := os.Open(fmt.Sprintf("./static/merge/%d-m.jpg", pid4))
centerImg4, _ = jpeg.Decode(centerImgFile4)
defer centerImgFile4.Close()
} else {
centerImgFile4, _ := os.Open("./static/image/white.jpg")
centerImg4, _ = jpeg.Decode(centerImgFile4)
defer centerImgFile4.Close()
}
offset1 := image.Pt(177, 172)
offset2 := image.Pt(1655, 172)
offset3 := image.Pt(177, 2108)
offset4 := image.Pt(1655, 2108)
//x轴坐标总数
m := image.NewRGBA(backgroundBound)
draw.Draw(m, backgroundBound, backgroundImg, image.Point{}, draw.Src)
draw.Draw(m, centerImg1.Bounds().Add(offset1), centerImg1, image.Point{}, draw.Over)
draw.Draw(m, centerImg2.Bounds().Add(offset2), centerImg2, image.Point{}, draw.Over)
draw.Draw(m, centerImg3.Bounds().Add(offset3), centerImg3, image.Point{}, draw.Over)
draw.Draw(m, centerImg4.Bounds().Add(offset4), centerImg4, image.Point{}, draw.Over)
imgw, _ := os.Create("./static/print/printer.jpg")
err := jpeg.Encode(imgw, m, &jpeg.Options{Quality: jpeg.DefaultQuality})
if err != nil {
log.Error("jpeg解码失败", err)
return err
}
defer imgw.Close()
return nil
}
这里面接受参数和返回参数可以自定义,我传的map里面存的是id号,然后方便取用id命名的图片来合成。