Imagemagick 通过指定新的纵横比来拟合图像

Imagemagick 通过指定新的纵横比来拟合图像,imagemagick,imagemagick-convert,Imagemagick,Imagemagick Convert,ImageMagick的转换是否可以在指定仅纵横比后附加白色或黑色条以保持纵横比 更具体地说 假设我有一个2000x1000宽的图像,我想计算一个宽高比为4:3的新图像,比如一台电视机。我能行 convert input.png -background black -extent 2000x1500 -gravity center output.jpg 但在这里,我手动选择了2000x1500来生成额外的250x2像素的blakc。我可以要求将转换为: 将纵横比更改为4:3 不丢失任何像素;不

ImageMagick的
转换
是否可以在指定纵横比后附加白色或黑色条以保持纵横比

更具体地说

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

convert input.png -background black -extent 2000x1500 -gravity center output.jpg
但在这里,我手动选择了2000x1500来生成额外的250x2像素的blakc。我可以要求
转换为:

  • 将纵横比更改为4:3
  • 不丢失任何像素;不插值任何像素
  • 将图像居中
  • ?


    如果也可以选择背景色作为图像的主色调(如iTunes 11),请务必说明。

    Convert没有内置功能将图像填充到给定的纵横比,因此您需要编写脚本。下面是如何在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
    
    注:

    • bc用于浮点运算,因为bash本身只有整数运算
    • 请注意,
      -gravity center
      位于
      -extent
      之前的最后一个命令行上。这是因为重力是一个设置,而范围是一个操作符。设置应始终位于它们影响的运算符之前,否则当命令开始变得更复杂时,convert将执行意外操作
    • 当您对程序的结果感到满意时,您可以复制并执行其输出,也可以在最终的
      转换之前删除
      回音
    对于查找图像主色的问题,有不同的方法,但一种常用的方法是将图像大小调整为1x1并输出结果像素的颜色-它将是整个图像的平均颜色:

    convert input.png -resize 1x1 -format '%[pixel:p[0,0]]' info:
    
    在调整大小之前,可以对图像进行其他处理,以获得不同的启发

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