将ImageMagick比较的结果捕获到一个变量中。

4

我正在使用一个叫做ImageMagick的软件,它有命令行输入功能来进行照片比较并输出值。 我想把这个输出值保存到一个特定的变量中以进一步分析。 我该如何做? 以下是我在命令行中运行的命令:

compare -metric MSE Picture1.jpg Picture2.jpg difference.png

这将比较图片1和图片2之间的像素差异。将其保存为“difference”,并输出差异的数字。如果相同,则为0。我希望能够以变量的形式捕获该值。


这是Shell脚本中非常基础的操作。显然,您需要先阅读一份教程。 - Barmar
1
在shell脚本中,区分命令的[stdout]输出和其退出代码是非常重要的,它们是不同的方面。有了远见卓识:你要寻找的是退出代码。 - mklement0
5个回答

7

对我有用:

variable=$(compare -metric MSE Picture1.jpg Picture2.jpg difference.png 2>&1)

或者

variable=$(compare -metric MSE Picture1.jpg Picture2.jpg null: 2>&1)

这段代码是关于比较两张图片的不同之处。使用"compare"命令,它将计算两张图片之间的均方误差(MSE)。在第一个示例中,"difference.png"是包含不同之处的输出文件的名称。在第二个示例中,"null:"表示输出被重定向到空设备,因此没有输出文件生成。变量"$variable"将包含命令的输出。

3
正如Ignacio Vazquez-Abrams在评论中指出的那样,compare 实际上是通过其 退出代码 而不是 stdout 输出来报告相似性状态的。
在他自己的答案中,Ignacio还提到:
  • 最近命令的退出代码会报告在特殊变量 $? 中。
  • 值得立即将该退出代码保存在一个变量中,以免随后的命令覆盖它。
此外,退出代码 0 表示图像是相似而不是相同
以下是一个代码片段,展示了如何保存退出代码并随后处理它:
compare -metric MSE Picture1.jpg Picture2.jpg difference.png # add >/dev/null for no output
ec=$?  # save exit code
case $ec in  # evaluate exit code
  0)
    echo "images are similar"
    ;;
  1)
    echo "images are dissimilar"
    ;;
  *)
    echo "an unexpected error occured"
    ;;
esac

1

命令的结果将始终在$?中。在执行另一个命令之前,确保将该值保存在另一个变量中,否则它将被覆盖。


1
使用命令替换。
variable=$(compare -metric MSE Picture1.jpg Picture2.jpg difference.png)

2
这也是我认为他们所问的内容,但是"compare程序返回2表示错误,如果图像相似则返回0,如果它们不同则返回1。" - Ignacio Vazquez-Abrams

0

或者使用反引号。也称为命令替换

variable=`compare -metric MSE Picture1.jpg Picture2.jpg difference.png`

echo "$variable"

这应该是对Barmar的回答的评论。虽然反引号语法在这种简单情况下运行良好,但是您应该提到与现代$(...)语法相比的缺点。 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接