ImageMagick - 如何强制最小/最大高度/宽度?

时间:2010-05-06 16:07:51

标签: unix command-line imagemagick

使用ImageMagick,如何调整图片大小以使最小

  • 高度150px
  • 宽度为200px

还有最大

  • 身高225px
  • 宽度为275px

更新

如果它有帮助,这里是我正在经历的进一步解释。

我有一系列具有不同比例尺寸的图像。一些图像具有1:5的高/宽比。有些具有5:1的高/宽比。所以我想要做的是设置图像的最小高度/宽度大小,但也不希望图像大小大于特定大小。

如果我需要对图像应用白色填充以使其适合我的约束,这样我就不必扭曲图像,我想这样做。

5 个答案:

答案 0 :(得分:12)

我不能完全理解您的要求,但我认为如果您运行IM两次,这应该是可能的。

请参阅geometry options上的手册:

的组合
  

widthxheight> 根据widthxheight进行更改,但仅限于图片尺寸超出指定尺寸。

  

widthxheight ^ 给定宽度和高度的最小值,保留宽高比。

可能会成功。但是,对于宽高比超出您要求的图像,我认为您必须在IM中创建一个固定大小的画布,用一些颜色填充它,插入图像,然后对其进行trim() ...可能但不可能一气呵成。

答案 1 :(得分:6)

好的,我做了一些类似的处理。我没有任意大小和宽高比的通用解决方案,但如果输入的图像集是1:5或5:1,则可以将它们分为2类,并使用其中一些代码片段进行相应处理。 / p>

步骤1:确定图像的纵横比,并根据该比例设置目标最终更改的尺寸。

INPATH="path/to/your_file.jpg"
DIMS=`identify "${INPATH}" | awk '{print $3}'`
WIDTH=`echo "${DIMS}"| cut -dx -f1`
HEIGHT=`echo "${DIMS}"| cut -dx -f2`
if (( ${WIDTH} > ${HEIGHT} ));
then
    #file is in landscape orientation
    THUMBDIM="80x60"
    WEBDIM="624x480"
else
    #file is in portrait orientation
    echo -n "(Portrait orientation) "
    THUMBDIM="60x80"
    WEBDIM="480x624"
fi

步骤2,进行实际调整大小:

convert "${INPATH}" -resize "${THUMBDIM}" "resized-${INPATH}"

此示例假定一组固定的所需大小,但当然您可以使用原始尺寸作为输入进行一些基本算术,并按比例按比例放大以适合您指定的范围。

答案 2 :(得分:5)

使用ImageMagick,您只需要两个mogrify次传递:一次放大小于所需最小值的一次,另一次缩小大于最大值的次数。例如,要批量调整一堆JPEG:

mogrify '*.jpg[!200x150<]'
mogrify '*.jpg[!275x225>]'

第一遍放大小于200x150的那些,第二遍收缩大于275x225的那些(是的,标志是正确的!)。 mogrify替换原始图像,这是您在这种情况下需要执行的操作,以避免在每次传递中重新调整图像大小并最终获得两个已处理的副本。

即使它们是两遍,你也只处理一次图像(差不多,见下文)。第一个进程 x %的图像和另一个进程处理剩余的100- x %(加上 c ,见下文),假设全部图像需要调整大小。

!用于强制超出范围(我们的常量 c )的图像的宽高比变化,例如1200x100的图像,不适合275x225或200x150。这些图像将被处理两次:在第一遍中,范围(高度或宽度)下方的方面将增加到最小,而在第二遍中,另一方面将减少到最大值。

希望有所帮助。

答案 3 :(得分:0)

您可以使用属于imagemagick套件的工具mogrify

有一个如何使用它的例子here

答案 4 :(得分:0)

基于以上内容:

#!/bin/bash

FILE="$1"
DIMS=`identify "${FILE}" | awk '{print $3}'`
WIDTH=`echo "${DIMS}"| cut -dx -f1`
HEIGHT=`echo "${DIMS}"| cut -dx -f2`
max_w=2000
max_h=2000

if [[ $HEIGHT -gt $max_h ]]; then
    WIDTH=$(( $WIDTH * $max_h / $HEIGHT ))
    HEIGHT="$max_h"
fi


if [[ $WIDTH -gt $max_w ]]; then
    HEIGHT=$(( $HEIGHT * $max_w / $WIDTH ))
    WIDTH="$max_w"
fi

echo "$FILE ${WIDTH}x${HEIGHT}"
mogrify -filter Lanczos -resize "${WIDTH}x${HEIGHT}" "$FILE"