Go使用imagick实现图片合并拼接并保留原图属性
问题
需要将两张图片拼接成一张图,并保证拼接完成的图片,保留指定图片的原有属性。水平分辨率、垂直分辨率不改变。
使用Go
自带image
类库,生成的图片水平、垂直分辨率被改为了96dpi
。
解决
安装Go imagick
依赖
- 安装msys2
# 运行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