我正在做一个项目,需要一张多种分辨率的图片。幸运的是,这张图片的宽度/高度分辨率相同,可以在所有具有相同高度和宽度的分辨率下很好地工作,即 80x80px 100x100px 等。
显然,我可以在 Adobe Photoshop 中手动完成此操作,但实际上我需要数百种不同的分辨率,从 73px 一直到 1000px,这将花费大量的手动时间。我搜索了网络,但得到的都是缩略图生成器或 Adobe Photoshop 批处理保存程序,但这仍然需要相当长的时间。
因此,这让我想到了一个问题,无论是在 Windows 还是 Linux 中,如何才能尽快从单个图像创建数百种分辨率。
答案1
我想根据源图像制作大量图像!
显然我可以在 Adobe Photoshop 中手动完成此操作......但这将花费大量的手动时间。
你说得对。让计算机去做那些简单的重复性工作吧;这就是它们擅长的。Tom Ruh 的答题笔记,您可以将其用于ImageMagick
此。
但是,存在一个问题:
幸运的是,图片4:3分辨率,并能与所有具有相同高度和宽度的分辨率配合良好,即80x80像素 100x100像素ETC。
(重点是我的)
目前尚不清楚您想要什么分辨率 - 所述的 4:3 还是隐含的 1:1。
但是,根据您的要求最小 73px和最大1000px和数百项决议;我写了一个小脚本,应该涵盖了大多数可能性(包括液态调整大小如果你愿意的话),可以通过改变一些变量来设置。
脚本,也可用来自 pastebin 以便于复制:
#!/bin/bash
# resizer.sh - resize target image between two resolutions
# accepts file as either first argument or by setting FILEPATH variable
# SETTINGS
SMALLEST_WIDTH=73 # px
LARGEST_WIDTH=1000 # px
FILEPATH= # set if you don't want to pass in image as argument
NUM_OF_RESOLUTIONS=100 # number of images generated; will generate between
# $SMALLEST_WIDTH and $LARGEST_WIDTH
RATIO= # set if you want to specify width/height
# (eg 1/1, 4/3, 16/9), blank is preserve current ratio
# NOTE: resizing to other aspect ratios may be slow/distorty:
# as per http://www.imagemagick.org/Usage/resize/#noaspect
# Seamless resizing (default) may be preferred, see:
# http://www.imagemagick.org/Usage/resize/#liquid-rescale
# but note it is slower, particularly as images get larger
LIQUID=0
# SCRIPT BELOW
# silent by default; uncomment "printf" lines for a description of what is happening
die() { printf "$@\n" 1>&2 ; exit 1; }
if [ -z "$FILEPATH" ]; then
if [ -z "$1" ]; then die "Need to supply file to work on either as argument or by setting FILEPATH!";
else FILE="$1";
fi
else
FILE="$FILEPATH"
fi
# check file exists and is regular file
if [ ! -e "$FILE" ]; then die "$FILE does not exist!"; fi
if [ ! -f "$FILE" ]; then die "$FILE is not a regular file!"; fi
i=0
step=$(echo "($LARGEST_WIDTH - $SMALLEST_WIDTH) / ($NUM_OF_RESOLUTIONS - 1)" | bc -l)
#printf "Resolution step is: %s\n-------------" "$step"
while [ $i -lt $NUM_OF_RESOLUTIONS ]; do
# handle ratio
WIDTH=$(echo "$SMALLEST_WIDTH+($step*$i)" | bc -l)
if [ -z "$RATIO" ]; then
#printf "convert %s -resize %s %s\n" "$FILE" "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
convert "$FILE" -resize "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
else
HEIGHT=$(echo "$WIDTH * $RATIO" | bc -l)
if [ "$LIQUID" -eq 0 ]; then
# Uncomment convert line for distorted ("squashed") resizing
#printf "convert %s -resize %sx%s\! %s\n" "$FILE" "$WIDTH" "$HEIGHT" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
convert "$FILE" -resize "$WIDTH"x"$HEIGHT"\! "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
else
# Liquid resizing: http://www.imagemagick.org/Usage/resize/#liquid-rescale
# fast aspect ration resize first, then liquid
#printf "convert %s -resize %s %s\n" "$FILE" "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
convert "$FILE" -resize "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
#printf "%s details are now:\n %s\n" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" "$(identify "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}")"
#printf "convert %s -liquid-rescale %sx%s\! %s\n" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" "$WIDTH" "$HEIGHT" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
convert "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" -liquid-rescale "$WIDTH"x"$HEIGHT"\! "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
fi
fi
(( i++ ))
done
注意:计算值等的子 shell 有点夸张,但没关系。如前所述,printf
可以取消注释这些行以了解正在发生的事情,否则它将默认按照沉默规则. 有些图像的尺寸与计算值并不完全一致(例如 193px 与 138.54545454545454545452px),因为您无法以有用的方式获得小数像素。
答案2
只要你能处理一些命令行并编写一些简单的 BASH 脚本。你可以使用图像魔术师