使用Mogrify在二维码上叠加一个图像的实例(附代码示例)

142 阅读2分钟

使用Mogrify在二维码上叠加图像

最近,我正在使用Elixir为我们的一个客户编写一个QR码生成器。有一个要求是在QRCode上面有一个标志,它应该在中心,以确定哪个公司的QR码被扫描。这篇文章是关于我在使用Mogrify Elixir库来实现这一要求方面的心得。

首先,我们需要生成一个QR码并将其存储在一个图像文件中:

	svgfilepath = Temp.path!(%{suffix: ".svg"})
	Poison.encode!(%{data: "Hello world"})
	|> QRCode.create(:high)
	|> Result.and_then(&QRCode.Svg.save_as(&1, svgfilepath))

我使用了temp库来创建一个临时文件和qr_code库来生成QR码。因为我需要从elixir地图中生成QR码,所以我使用毒药库将其编码为json字符串。

使用qr_code库提供的Result.and_then() 方法,我们可以将QR码存储在一个.svg 文件中。

为了将一张图片重叠在另一张图片上,我们需要另一个elixir库。为此我遇到了Mogrify。Mogrify使用ImageMagick进行图像处理。

你可以按照官方网页上的说明来安装ImageMagick。

安装好ImageMagick后,我们可以用Mogrify在二维码图片上重叠标识。

通过ImageMagick的文档,我发现我需要使用库中提供的composite 命令,将一张图片重叠在另一张图片上。

在浏览了Mogrify的readme之后,我没有发现任何使用Imagemagick的composite 命令的方法。我检查了该库的开放问题。我发现了这个问题,它指向另一个问题,提到使用image_operator 方法,因为库不支持composite 命令。

我按照这个评论ImageMagick的复合命令文档,将一张图片重叠在另一张上面:

	logo_png = File.cwd!() <> "/logo.png"
	pngfilepath = Temp.path!(%{suffix: ".png"})

	Mogrify.open(svgfilepath)
	|> Mogrify.format("png")
	|> Mogrify.save(path: pngfilepath)

	File.rm!(svgfilepath)

	conversion_command_string = "convert #{pngfilepath} #{logo_png}\
	  -gravity center -composite -size 500x500"

	Mogrify.open(svgfilepath)
	|> Mogrify.image_operator(conversion_command_string)
	|> Mogrify.create(inplace: true)

svg 图像被转换为png 格式后,我们可以使用File.rm!() 删除该文件。

我通过将svg 二维码图像转换为png ,然后将其与标志图像重叠,就能将标志图像重叠在二维码上面了。以下是成功扫描QR码时的截图:

qr_code