问题

需要将两张图片拼接成一张图,并保证拼接完成的图片,保留指定图片的原有属性。水平分辨率、垂直分辨率不改变。

使用Go自带image类库,生成的图片水平、垂直分辨率被改为了96dpi
原图属性
合并完成后图片属性

解决

安装Go imagick

依赖

# 运行msys2 在msys2终端指定
pacman -Syuu
pacman -S mingw-w64-x86_64-gcc
pacman -S mingw-w64-x86_64-pkg-config
pacman -S mingw-w64-x86_64-zlib
pacman -S mingw-w64-x86_64-imagemagick
  • 配置环境变量
# <msys64> 为msys2安装路径
PATH=<msys64>\mingw64\bin;%PATH%
PKG_CONFIG_PATH=<msys64>\mingw64\lib\pkgconfig
MAGICK_CODER_MODULE_PATH=<msys64>\mingw64\lib\ImageMagick-7.0.6\modules-Q16HDRI\coders
  • 项目中使用
go build gopkg.in/gographics/imagick.v3/imagick
使用
// 使用imgick对底图进行拓展,然后将第二张图片和底图进行拼接。
func MergeImagick() error {
	imagick.Initialize()
	defer imagick.Terminate()
	var err error
    // 加载底图
	bg := imagick.NewMagickWand()
	err = bg.ReadImage("resource/bg.jg")
	w := bg.GetImageWidth()
	h := bg.GetImageHeight()
    // 加载第二张图片
	code := imagick.NewMagickWand()
	err = code.ReadImage("resource/qrcode.png")
    // 扩展底图高度
	err = bg.ExtentImage(w, h+100, 0, 0)
    // 合成两张图片 imagick.COMPOSITE_OP_OVER  code 覆盖 bg 第二张图覆盖在底图上
	err = bg.CompositeImage(code, imagick.COMPOSITE_OP_OVER, true, 0, int(h))
    // 生成图片
	err = bg.WriteImage("resource/newpic.jpg")
    // 销毁
	bg.Destroy()
	code.Destroy()
	imagick.Terminate()

	return err
}

结果

使用imagick拼接后的图片保留了底图的属性,除了扩展后高度的增加。
原图属性
拼接后图片属性

后续

代码打包可执行文件,运行出现找不到dll情况,暂且不清楚所需要dll。改为调用magick程序。

安装ImageMagick

下载地址: https://imagemagick.org/script/download.php#windows

安装成功后进入终端执行以下命令,

magick -version

返回ImageMagick版本信息则为正常。

Version: ImageMagick 7.1.0-50 Q16-HDRI x64 f032690:20221008 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenCL OpenMP(2.0)
Delegates (built-in): bzlib cairo flif freetype gslib heic jng jp2 jpeg jxl lcms lqr lzma openexr pangocairo png ps raqm raw rsvg tiff webp xml zip zlib
Compiler: Visual Studio 2022 (193331630)
代码
func MergeImagickInstall(url string) error {
	// 打开底图
	bg, _ := os.Open(url)
	bgpic, _ := jpeg.Decode(bg)
	defer bg.Close()
	// 获取底图尺寸
	bgpicBounds := bgpic.Bounds()
	resize := strconv.Itoa(bgpicBounds.Size().X) + `x` + strconv.Itoa(bgpicBounds.Size().Y+100)
	// 首先将底图拓展
	extentShell := `magick ` + url + `  -background white -extent ` + resize + `  resource/output.jpg`
	extentShellCmd := exec.Command("cmd.exe", "/c", extentShell)
	extentShellCmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
	err := extentShellCmd.Run()
	if err != nil {
		log.Println(err)
	}
	// 然后将第二张图片的位置设置在 x 0 y 底图高度 的位置并合成
	compositeShell := `magick composite -geometry +0+` + strconv.Itoa(bgpicBounds.Size().Y) + ` resource/qrcode.png resource/output.jpg resource/output.jpg`
	compositeShellCmd := exec.Command("cmd.exe", "/c", compositeShell)
	compositeShellCmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
	err = compositeShellCmd.Run()
	if err != nil {
		log.Println(err)
	}
	return err
}

参考链接

https://pkg.go.dev/gopkg.in/gographics/imagick.v3
https://github.com/gographics/imagick
https://www.imagemagick.org/MagickWand/
https://blog.csdn.net/qq_24127015/article/details/86525305
https://imagemagick.org/script/magick.php