将图像缩放到固定的目标像素大小

将图像缩放到固定的目标像素大小

我想将 JPG 图像的大小减小到相同的总像素大小(例如 6MPx),无论输入大小或比率如何。


当然mogrifyconvert可以调整大小:

这 ...

mogrify -resize 3000x3000 file.jpg

...对于比例为 3:2 的图片,将为我提供 6MPx。

但这不适用于不寻常的比例,例如全景图。


问:如何使用mogrify/convert获取指定的目标像素大小?

答案1

我做了一个小脚本要做。

$ cat ~/bin/resize_picture

#!/bin/bash

set -euo pipefail

usage(){
cat <<EOF
# USAGE:
    resize_picture TARGET_PX FILE...

# EXAMPLES:
    resize_picture 6000000 *.jpg
    find . -type f -name '*.jpg' resize_picture 8000000 {} +
EOF
exit
}

[ $# -lt 2 ] || [ "$1" = "-h" ] && usage

target=$1
shift

for file in "$@"; do
    printf "Processing %s ... " "$file"

    percent=$(
    identify -format '%w %h' -- "$file" \
    | awk -v t="$target" '
        $1*$2 > t  { r=$1/$2; printf "%.0f",sqrt(t*r)/$1*100 }
        $1*$2 <= t {printf "%d",100}
      '
    )

    if [ $percent -lt 100 ] ; then
        mogrify -resize "$percent"% "$file"
        printf 'Done (%d %%)\n' "$percent"
    else
        echo "Nothing to do"
    fi
done

答案2

convert完美地完成了这个任务。

忽略纵横比('!'标志)

忽略纵横比('!'标志)如果您愿意,可以强制“-resize”忽略纵横比并扭曲图像,以便它始终生成与指定大小完全相同的图像。这是通过添加字符“!”来完成的到尺寸。不幸的是,这个字符有时也被各种 UNIX 命令行 shell 用于特殊目的。因此,您可能必须以某种方式转义该角色才能保留它。

convert dragon_sm.gif -resize 64x64\! exact_dragon.gif convert terminal.gif -resize 64x64\! exact_terminal.gif

相关内容