我正在使用ImageMagick创建一个带水印的新调整大小的图像,使用这个单一命令(在PHP中):
exec("convert -filter Lanczos {$original_image} -thumbnail {$max_width}x{$max_height} -quality 90 {$watermark} -gravity center -unsharp 2x0.5+0.7+0 -composite {$cached}");
现在我切换到GM并且正在寻找运行1命令来执行相同任务的方法。我找到的唯一方法是将其拆分为两个单独的命令:
//create the resized image
exec("gm convert -filter Lanczos {$original_image} -thumbnail {$max_width}x{$max_height} -quality 90 -unsharp 2x0.5+0.7+0 {$cached}");
//apply the watermark and recreate the watermarked image, overwriting the previously resized image
exec("gm composite -quality 90 -dissolve 100 -gravity center {$watermark} {$cached} {$cached}");
有没有办法将它们组合成1个单一命令,这可能也会减少资源和开车使用?
答案 0 :(得分:1)
我收到了来自GraphicsMagick Maintainer的Bob Friesenhahn的以下回复:
您没有说明您使用的是什么版本的GraphicsMagick。现代 版本支持'-compose'选项,该选项可以放在命令上 输入文件名后的行记住组合算法 使用。然后使用该组合算法,如果是 - 马赛克或 - 范围运算符用于执行合成。你也可以使用 -page选项在输入文件名后用来定位图像 与列表中的先前图像合成。由于缺点 GM的转换命令处理,-mosaic或-extent运算符必须 是保存输出文件之前的最后一个命令。我相信 ImageMagick的-composite必须是-mosaic的版本,它会增加更多 特征(例如-mosaic可能不支持重力,但-composite确实如此)。 似乎GraphicsMagick应该完全实现一些东西 兼容ImageMagick的-composite。 无论如何,如果需要,可以使用有效的解决方法 使用现有的GM命令。 如果你有一个支持'gm batch'的现代GraphicsMagick,那么 你可以使用'mpr'编码器(“Magick Persistent Registry”)来记住 命令之间的中间图像,您可以轻松地适应您的两个 使用现有命令以完全高效执行的命令 线。这个Unix shell示例应该给你一些想法:
{
echo convert seaworld.jpg mpr:temporary
echo convert mpr:temporary crap.jpg
} | gm batch -prompt off -echo on
convert seaworld.jpg mpr:temporary
convert mpr:temporary crap.jpg
请注意,第一个命令的输出已保存(作为图像 在GraphicsMagick中本地使用的句柄转换为'mpr:temporary' 然后第二个命令从'mpr:temporary'获取输入并写入 最终的输出文件。您可以使用任意字符串参数 'mpr:'所以你可以在飞行中有几张图像。 使用这种方法,你可以使用'gm convert'和'gm composite' 同一批次命令。 我不确定如何最好地从PHP访问这个批处理工具 但是如果PHP可以从管道向它传输命令,那么它可以运行 很长一段时间作为PHP的协同进程并节省了大量的计算 时间和开销。