Створіть сотні резолюцій з одного зображення


8

Я працюю над проектом, де мені потрібно одне зображення в декількох резолюціях. Досить вдало, що зображення має однакову роздільну здатність ширини / висоти, і воно буде добре працювати з усіма роздільними здатностями з однаковою висотою та шириною, тобто 80x80px 100x100px і т.д.

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

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


1) у них є такі CDN, як ImgIx, які дозволять динамічно змінювати розмір зображень для вас. 2) Я використовував ThumbNailer від менших тварин (15 доларів) для створення пакетних зображень. Ви просто запускаєте його за допомогою командного рядка з "профілями", які ви налаштовуєте, і викликаєте через командний рядок. Для кожної роздільної здатності вам знадобиться окремий профіль. Оскільки ваші зображення розміром 1: 1 і вам не потрібні "розумні" зміни розміру, я думаю, що ImageMagick буде більш ніж достатньо.
Нд

Чи можете ви замість цього використати одне векторне зображення?
Anonsage

2
Мені цікаво щодо проекту, який потребував би сотні однакових зображень різного розміру. Це не стосується відповіді, але я все-таки цікавий.

2
Ви впевнені, що вам потрібне зображення у такій кількості резолюцій? Подумайте про це ще раз, набагато ретельніше. Обговоріть це з іншими людьми. Я не можу виключити, що є десь кращий випадок, де це справді так, але якби я мав робити ставку, я ставлю на те, що "ти робиш це неправильно".
o0 '.

@Lohrois ваше право нам не потрібні всі, але заради 30 Мб в цілому (1000 фунтів) це не велика проблема для PNG, які не використовуються.
Саймон Хейтер

Відповіді:


19

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

Очевидно, я міг би це зробити вручну в Adobe Photoshop ... і це зайняло б дурну кількість ручного часу.

Ви так праві. Нехай комп'ютер виконує легку повторювану роботу; ось у чому вони хороші. Як зазначається у відповіді Тома Ру , ви можете використовувати ImageMagickдля цього.

Однак є проблема:

На щастя, зображення має роздільну здатність 4: 3, і воно буде добре працювати з усіма роздільними здатностями з однаковою висотою та шириною, тобто 80x80px 100x100px і т.д.

(наголос мій)

Не ясно, яку резолюцію ви хочете - 4: 3, як зазначено, або 1: 1 як мається на увазі.

Однак, виходячи з ваших вимог мінімальної 73px та максимальної 1000px і hundereds резолюцій ; Я написав невеликий сценарій, який повинен охоплювати більшість можливостей (включаючи рідинну зміну розміру за випадковим випадком, який ви хотіли б), який можна встановити, змінивши деякі змінні.

Сценарій, також доступний з пастіна тут для легшого копіювання :

#!/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
Вуоху, дивовижно! щойно перевірений, і він спрацював чудово, але, на жаль, це створює нову проблему міток файлів, оскільки 1, 2, 3, 4 і т. д. не інформує мене про дозвіл без необхідності робити математику або перевіряючи зображення. Чи знаєте ви, як я можу адаптувати скрипт для додавання роздільної здатності до імені файлу, filename-500x500.pngа не доfilename-1.png
Simon Hayter

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

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

Що стосується того, що я мав на увазі під 4: 3, було співвідношення сторін у телевізорах та моніторах, квадратних .. тобто google.co.uk/…, а не лист 16: 9 тощо.
Simon Hayter

1
Мені доведеться завантажити його, дякую! слухайте! .... Ваша легенда, сценарій працює приголомшливо! дякую за всю вашу допомогу.
Simon Hayter

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.