web-dev-qa-db-ja.com

1つの画像から数百の解像度を生成します

複数の解像度の単一の画像が必要なプロジェクトに取り組んでいます。幸運なことに、画像は同じ幅/高さの解像度であり、同じ高さと幅のすべての解像度、つまり80x80px100x100pxなどでうまく機能します。

明らかに、Adobe Photoshopでこれを手動で行うことはできますが、文字通り73pxから1000pxまでの何百もの異なる解像度が必要であり、これには手作業でばかげた時間がかかります。ネットを検索しましたが、サムネイルジェネレーターまたはAdobe Photoshopのバッチセーバーしか取得できませんが、それでもかなりの時間がかかります。

それで、私の質問になります。WindowsまたはLinuxのいずれかで、1つの画像から何百もの解像度をできるだけ早く作成するにはどうすればよいですか。

8
Simon Hayter

ソース画像を元にたくさんの画像を作りたい!

明らかに、Adobe Photoshopでこれを手動で行うことができました...そして、これにはばかげた量の手動時間がかかります。

あなたはとても正しいです。コンピューターに簡単な繰り返し作業をさせます。それが彼らの得意なところです。 Tom Ruhの回答ノート として、これにはImageMagickを使用できます。

ただし、問題があります。

幸運なことに、画像は4:3の解像度であり、同じ高さと幅のすべての解像度、つまりでうまく機能します。 )80x80px100x100pxなど.

(強調鉱山)

どの解像度が必要かは明確ではありません-述べられているように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

注:値などを計算するためのサブシェルについては少しやりすぎですが、ちょっと待ってください。前述のように、printf行は、何が起こっているのかを知るためにコメントを外すことができます。そうしないと、 Rule of Silence に従って、デフォルトでサイレントに動作します。一部の画像は、計算されたとおりの寸法になりません(たとえば、193pxと138.54545454545454544545452px)。これは、便利な方法で小数のピクセルを使用できないためです。

19
bertieb

コマンドラインを処理し、簡単なBASHスクリプトを記述できる限り。 ImageMagick を使用できます

7
Tom Ruh