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

Unix ImageMagick-如何强制执行最小/最大高度/宽度?,unix,command-line,imagemagick,Unix,Command Line,Imagemagick,使用,如何调整图像大小以使其最小值: 高度为150px 200px的宽度 还有一个最大值: 高度225px 275px的宽度 更新: 如果有帮助的话,这里有一个我正在经历的进一步解释 我有一大堆不同比例维度的图像。有些图像的高宽比为1:5。有些有5:1的高宽比。因此,我要做的是设置图像的最小高度/宽度大小,但也不希望图像大小大于特定大小 如果我需要对图像应用白色填充,使其符合我的约束条件,从而不必扭曲图像,我愿意这样做。我无法完全理解您的要求,但我认为如果您运行IM两次,这应该是可能的

使用,如何调整图像大小以使其最小值

  • 高度为150px
  • 200px的宽度
还有一个最大值

  • 高度225px
  • 275px的宽度
更新

如果有帮助的话,这里有一个我正在经历的进一步解释


我有一大堆不同比例维度的图像。有些图像的高宽比为1:5。有些有5:1的高宽比。因此,我要做的是设置图像的最小高度/宽度大小,但也不希望图像大小大于特定大小


如果我需要对图像应用白色填充,使其符合我的约束条件,从而不必扭曲图像,我愿意这样做。

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

请参阅以下方面的手册:

组合

宽度高度>仅当图像尺寸超过指定尺寸时,才根据宽度高度进行更改

宽度xheight^给定宽度和高度的最小值,保留纵横比


也许能奏效。但是,对于纵横比超出您要求的图像,我认为您必须在IM中创建一个固定大小的画布,用一些颜色填充,插入图像,然后对其执行
修剪()。。。不过,一次完成可能不太可能。

好的,我会做一些类似的处理。我没有针对任意大小和纵横比的通用解决方案,但如果您的输入图像集为1:5或5:1,则可以将它们分为两类,并使用其中一些代码段进行相应的处理

步骤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}"
此示例假定一组固定的所需尺寸,但您当然可以使用原始尺寸作为输入进行一些基本运算,并按比例放大以适应指定的边界。

您可以使用imagemagick套件中的工具

基于以上内容,有一个如何使用它的示例:

#!/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"

使用ImageMagick,您只需要两次
mogrify
过程:一次放大小于所需最小值的过程,另一次缩小大于最大值的过程。例如,要批量调整一组JPEG的大小:

mogrify '*.jpg[!200x150<]'
mogrify '*.jpg[!275x225>]'
mogrify'*.jpg[!200x150]'
第一次放大小于200x150的,第二次缩小大于275x225的(是的,符号是正确的!)
mogrify
替换原始图像,这是您在本例中需要执行的操作,以避免每次都重新调整图像的大小,并最终得到两个已处理的副本

即使它们是两个过程,您也只能对每个图像处理一次(几乎,请参见下文)。第一个过程处理x%的图像,另一个过程处理剩余的100-x%(加上c,见下文),假设所有图像都需要调整大小

这个!用于强制更改超出范围(我们的常量c)的图像的纵横比,例如1200x100的图像,它既不适合275x225也不适合200x150。这些图像将被处理两次:第一次扫描时,低于范围(高度或宽度)的纵横比将增大到最小,第二次扫描时,其他纵横比将减小到最大


希望这能有所帮助。

您将使用的实际大小调整因子是什么?百分比?我的意思是,你不能告诉ImageMagick将一个图像的大小调整为两个值之间的值-你必须至少指定一个值,不是吗?我有一系列具有所有不同比例维度的图像。有些图像的高宽比为1:5。有些有5:1的高宽比。所以我想做的是设置一个最小值,高度/宽度是X,但也不要让高度/宽度变得太大&失控,所以我想限制高度/宽度-即使这意味着用空白填充图像以使图像符合这些限制。那么命令行代码会是什么样子呢?转换宽度xheight^=200x150宽度xheight=275x225@HenryH我不认为这样行。你必须在每张图片上运行两次,一次将其增大到最小尺寸(如有必要),一次将其减小(如有必要)。你是否介意更新你的回复帖子,以获得执行此操作所需的代码。thanks@HenryH对不起,我现在手头没有Imagemagick来测试到底需要什么序列(我也需要反复尝试,我不经常使用IM)。也许其他人也能想到它。@HenryH不过,为了清楚起见,最基本的想法是对同一幅图像调用两次
convert
。一次把它缩小到最小尺寸,一次把它缩小到最大尺寸。如果[${WIDTH}>${HEIGHT}]
按字母顺序进行比较,则行
将1000<800。我将其替换为数字比较。不确定是否所有shell都会有这种算术计算(因为原始问题被标记为
unix
,而不是
bash
macos
linux
),但
[“$WIDTH”-gt“$HEIGHT”]
应该是可移植的。请注意变量周围的引号,bashshell的
[[]]
表达式不需要这些引号。