通过指定新的宽高比来拟合图像

时间:2014-03-10 04:56:59

标签: imagemagick imagemagick-convert

在指定宽高比后,ImageMagick的convert可以附加白色或黑色条以保持宽高比吗?

更具体地

假设我有一个2000x1000的宽镜图像,我想计算一个宽高比为4:3的新图像,比如电视。我能做到

convert input.png -background black -extent 2000x1500 -gravity center output.jpg

但是在这里我手动选择2000x1500来产生额外的250x2像素的blakc。我可以问convert

  1. 将宽高比更改为4:3
  2. 不会丢失任何像素;不插入任何像素
  3. 图像居中
  4. 如果还可以选择背景颜色作为图像中的主色(如在iTunes 11中),请提及如何使用。

1 个答案:

答案 0 :(得分:1)

转换没有内置功能来将图像填充到给定的宽高比,因此您需要编写脚本。以下是在bash中如何做到这一点:

#!/bin/bash -e

im="$1"
targetaspect="$2"

read W H <<< $(identify -ping -format "%w %h" "$im")
curaspect=$(bc <<< "scale=10; $W / $H")

echo "current-aspect: $curaspect; target-aspect: $targetaspect"

comparison=$(bc <<< "$curaspect > $targetaspect")
if [[ "$comparison" = "1" ]]; then
    targeth=$(bc <<< "scale=10; $W / $targetaspect")
    targetextent="${W}x${targeth%.*}"
else
    targetw=$(bc <<< "scale=10; $H * $targetaspect")
    targetextent="${targetw%.*}x$H"
fi

echo convert "$im" -background black \
    -gravity center -extent "$targetextent" \
    output.jpg

使用输入图像调用此脚本,并将目标宽高比指定为浮点数(例如,4/3 = 1.333):

$ do-aspect input.png 1.333

注意:

  • bc用于浮点数学运算,因为bash本身只有整数运算。
  • 请注意-gravity center位于-extent之前的最后一个命令行。这是因为gravity是设置,而extent是运算符。设置应始终位于它们影响的运算符之前,否则转换将在命令开始变得更复杂时执行意外操作。
  • 如果您对该计划的结果感到满意,您可以复制并执行其输出,或者只是在最终echo之前删除convert

关于找到图像的主色的问题,有不同的方法可以做到这一点,但一种常见的方法是将图像大小调整为1x1并输出合成像素的颜色 - 它将是平均颜色整个形象:

convert input.png -resize 1x1 -format '%[pixel:p[0,0]]' info:

您可以在调整大小之前对图像进行其他处理,以获得不同的启发式方法。