Создайте сотни разрешений из одного изображения


8

Я работаю над проектом, где мне нужно одно изображение в нескольких разрешениях. К счастью, изображение имеет одинаковое разрешение по ширине и высоте и будет хорошо работать со всеми разрешениями с одинаковой высотой и шириной, т.е. 80x80px, 100x100px и т. Д.

Очевидно, я мог бы сделать это вручную в Adobe Photoshop, но мне буквально нужны сотни разных разрешений от 73px до 1000px, и это заняло бы глупое количество ручного времени. Я искал в сети, и все, что я продолжаю получать, - это генераторы миниатюр или пакетная заставка Adobe Photoshop, которые все еще занимают значительное количество времени.

Итак, что подводит меня к моему вопросу: как я могу создать сотни разрешений из одного изображения как можно быстрее, в Windows или Linux.


1) у них есть CDN, такие как ImgIx, которые будут динамически изменять размер изображений для вас. 2) Я использовал ThumbNailer от Smaller Animals (15 долларов) для пакетной обработки изображений. Вы просто запускаете его через командную строку с «профилями», которые вы настраиваете, и вызываете через командную строку. Для каждого разрешения вам потребуется отдельный профиль. Поскольку ваши изображения имеют размер 1: 1 и вам не нужны «интеллектуальные» параметры изменения размера, я думаю, ImageMagick будет более чем достаточно.
Вс

Не могли бы вы вместо этого использовать одно векторное изображение?
Anonsage

2
Мне любопытно относительно проекта, который потребовал бы сотен того же самого изображения в различных размерах. Это не имеет отношения к ответу, но тем не менее мне любопытно.

2
Вы уверены, что вам нужно изображение в стольких разрешениях? Подумайте об этом еще раз, гораздо более тщательно. Обсудите это с другими людьми. Я не могу исключить, что где-то есть крайний случай, где это действительно так, но если бы мне пришлось делать ставку, я бы поставил на «вы делаете это неправильно».
о0 '.

@Lohrois ваше право, мы не нуждаемся в них всех, но ради 30 МБ в общей сложности (1000 pngs) это не большая проблема для PNG, которые не используются.
Саймон Хейтер

Ответы:


19

Я хочу сделать много изображений на основе исходного изображения!

Очевидно, я мог бы сделать это вручную в Adobe Photoshop ... и это заняло бы много времени.

Ты так прав. Пусть компьютер выполняет легкую повторяющуюся работу; вот в чем они хороши. Как отмечает ответ Тома Руха , вы можете использовать ImageMagickдля этого.

Тем не менее, есть проблема:

К счастью, изображение имеет разрешение 4: 3 и будет хорошо работать со всеми разрешениями с одинаковой высотой и шириной, т.е. 80x80px, 100x100px и т. Д.

(акцент мой)

Непонятно, какое разрешение вы хотите - 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строки могут быть некомментированы для представления о том, что происходит, в противном случае он будет работать по умолчанию в соответствии с правилом молчания . Некоторые изображения не будут иметь размеры точно такие, как рассчитано (например, 193px против 138.54545454545454545452px), потому что вы не сможете использовать дробные пиксели.


1
Woohoo, круто! только что протестировал, и он работал прекрасно, но, к сожалению, это создает новую проблему с метками файлов, так как 1, 2, 3, 4 и т. д. не сообщают мне о разрешении, не прибегая к математике или проверке изображения. Вы случайно не знаете, как я могу адаптировать скрипт для добавления разрешения к имени файла, т.е. filename-500x500.pngвместоfilename-1.png
Саймон Хейтер

Рад, что это работает к вашему более или менее удовлетворению. Спасибо за разъяснение, я обновлю ответ более описательным именем файла. Хватило бы filename-width.png? Один из режимов ( сохранить исходное соотношение сторон ) напрямую не вычисляет явную высоту. Я могу достаточно легко получить информацию (через identify), но это сохранит дополнительный вызов для каждого изображения в случае исходного соотношения сторон.
Бертиб

Вау, спасибо за быстрый ответ! да ширина будет делать работу, так как я автоматически принимаю то же число для высоты.
Саймон Хейтер

Что касается того, что я имел в виду под 4: 3, было соотношение сторон, найденное в телевизорах и мониторах, квадратные, т.е. google.co.uk/…, а не в почтовом ящике 16: 9 и т. Д.
Саймон Хейтер,

1
Мне придется скачать его, спасибо! слушай! .... твоя легенда, скрипт работает потрясающе! Спасибо за твою помощь.
Саймон Хейтер

7

Пока вы можете обработать некоторую командную строку и написать несколько простых сценариев BASH. Вы можете использовать ImageMagick


1
Если разрешение в формате 4: 3, то при ширине 4 пикселя вы поднимаетесь еще на 3. Кроме того, разрешения 80x80 или 100x100 имеют соотношение сторон 1: 1. Поскольку вы переходите с соотношения 4: 3 к соотношению 1: 1, вам придется либо растянуть изображение, либо обрезать лишние пиксели. Не уверен, имеет ли это значение, но не могли бы вы просто сохранить разрешение 4: 3, чтобы избежать этого?
Герута

1
Приятно знать, что решение возможно, но это не ответит, как его достичь. Можете ли вы расширить свой ответ примером или некоторыми инструкциями? Спасибо.
fixer1234

1) Вы можете использовать convert.exe , которая является частью ImageMagic с -resize вариант: imagemagick.org/discourse-server/viewtopic.php?t=15438
Вс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.