go 实现图片拼接

在网上搜集了很多资料,自己做了一个工具,可应用于生产环境。

目的:拼接图片合成,在图片模板上合成

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命名的图片来合成。

参考于go如何实现图片拼接,文字书写 | 码农家园 (codenong.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值