ImageMagick – консольний графічний редактор, який складається з кількох окремих утиліт. Як його встановити і що вміє кожна утиліта, я розповів у статті ImageMagick: встановлення і перші кроки. А тут розглянемо головну й найпопулярнішу утиліту – convert – на живих прикладах.

Насправді дана утиліта має надзвичайно багато різноманітних можливостей, тож якщо б я почав описувати їх усі, то ти би втомився/лась читати. Саме з цієї причини я опишу тільки базові можливості утиліти convert, а якщо тобі цікаво, то повний список функцій можна подивитися на офіційному сайті програми.

Використання convert

Синтаксис утиліти такий (вводити у терміналі):

convert <початкове_зображення> <команди> <кінцеве_зображення>

У новіших версіях ImageMagick замість convert пишуть magick: наприклад, magick tux.webp -resize 50% tux4.webp. Усе інше в командах лишається так само, тож приклади нижче працюють з обома варіантами.

Візьмемо для прикладу зображення лінуксового пінгвінятка у форматі jpg розміром 250х300 пікселів і будемо проводити над ним досліди (не болючі зовсім):

Оригінал

Конвертація з одного формату в інший

Найпростіше, що вміє convert, – змінити формат. Розширення кінцевого файлу саме підказує програмі, у що перетворювати:

convert tux.png tux.webp
convert photo.heic photo.jpg

А так можна перевести у WebP одразу всі PNG у папці:

for f in *.png; do convert "$f" "${f%.png}.webp"; done

Для сайту корисно ще прибрати з картинки зайві метадані (дані камери, геолокацію тощо) – файл стане легшим:

convert photo.jpg -strip -quality 75 photo-web.jpg

Команда resize

convert tux.webp -resize 100x100 tux2.webp

resize

Зображення зменшиться до розміру 100х100 пікселів зі збереженням пропорцій, тобто більша сторона буде мати 100 пікселів, а менша відповідно до пропорцій, у даному випадку – 83px.

convert tux.webp -resize 100x100! tux3.webp

resize

Зображення зменшиться до розміру 100х100 пікселів без збереження пропорцій, тобто картинка розтягнеться до квадрата 100х100, попри спотворення. А що – ти ж сам/а так хотів/ла 😋

convert tux.webp -resize 50% tux4.webp

resize

Зміна розміру картинки у відсотках від початкового розміру. Якщо ти вказав 50% для картинки 250х300, то отримаєш 125х150.

convert tux.webp -resize @10000 tux5.webp

resize

Цікаве завдання для imagemagick. Ти задаєш, яка має бути загальна кількість пікселів у картинці, а прога сама вираховує, на скільки зменшити картинку. Наприклад, у тебе є картинка 1000х1000 пікселів (загальна кількість – 1000000 пікселів), а ти задаєш параметр @100. В результаті має вийти 100 пікселів, тобто програма зменшує картинку до розміру 10х10. У нашому випадку картинка не квадратна, тому програма автоматично вираховує найбільше значення, яке може підійти для пропорцій картинки, але не перевищує кількості вказаних пікселів, тобто 91х109px (91*109=9919)

А тепер фокус. Змінюємо розмір усіх зображень у теці, щоб вони не перевищували заданого розміру. Фактично це пакетна зміна розміру по довшій стороні зображення. Я постійно користуюся цією функцією, коли зменшую фото для завантаження на сайт:

for f in *.jpg; do convert "$f" -resize 800x800 "resize_$f"; done

У результаті виходять зображення, у яких довша сторона має розмір 800 пікселів незалежно від того, у книжковому чи альбомному розташуванні було зроблене фото. Лапки навколо $f потрібні, щоб команда не спотикалася на назвах файлів із пробілами. А якщо копії не потрібні і можна змінити самі файли, є ще коротший шлях – утиліта mogrify: mogrify -resize 800x800 *.jpg (тільки обов'язково працюй із копією папки!). Схожу функцію я колись описував у переглядачі зображень FastStone Image Viewer для Windows.

Команда crop

convert tux.webp -crop 100x100 tux6.webp

Дана команда нарізає зображення із заданим розміром. Так, саме нарізає – у нашому випадку вийде 9 зображень, 6 – 100х100 і 3 – 50х100 пікселів. Щоб вирізати одне зображення із заданим розміром, потрібно задати ще відступи від верхнього лівого краю:

convert tux.webp -crop 100x100+50+100 tux6.webp

Дана команда обріже зображення ось так:

crop

crop

Команда gravity

convert tux.webp -gravity SouthEast -crop 150x150+0 tux7.webp

Якщо треба обрізати якусь певну рівну частину зображення (із центру, правий верх, лівий низ тощо), можна не вираховувати пікселів, а просто вказати напрям через команду gravity з допомогою цілого списку параметрів типу морського зюйд-зюйд-вест. Вийде щось отаке:

gravity

Повний список параметрів команди gravity:

None Center East Forget NorthEast North NorthWest SouthEast South SouthWest West

Повороти зображення

convert tux.webp -rotate 90 tux8.webp

Команда -rotate дозволяє повернути зображення на заданий кут. В результаті виконання команди, вказаної вище, отримаємо отаке зображення:

rotate

А при обертанні на інший кут, наприклад, на 45°, розмір зображення збільшиться для того, щоби вмістити усі пікселі, ось так (червоні рамки додані для наочності):

convert tux.webp -rotate 45 tux9.webp

rotate

Командами -flip і -flop можна відзеркалити зображення по вертикалі та по горизонталі відповідно:

convert tux.webp -flip tux10.webp
convert tux.webp -flop tux11.webp

flip flop

Розмивання зображень

Все просто, Гаусове розмивання робиться легкою командою -blur із зазначенням радіусу розмивання:

convert tux.webp -blur 10 tux12.webp

blur

Прості трюки з кольорами

Ось так можна інвертувати всю колірну гаму зображення:

convert tux.webp -negate tux13.webp

negate

А ось так – перевести в інший колірний простір:

convert tux.webp -colorspace Gray tux14.webp

colorspace

Повний список колірних просторів можна знайти на офіційному сайті ImageMagick. Даний приклад я навів тільки через те, що мені часто самому доводиться перетворювати документи у чорно-білий режим.

Ігри з якістю зображень

Тут я б хотів виділити лише дві команди. Перша – -quality – задає, власне, якість майбутнього зображення:

convert tux.webp -quality 75 tux15.webp
Оригінал - 19.4 Кб
Оригінал - 19.4 Кб
Якість 75% – 15.6 Кб
Якість 75% – 15.6 Кб

Як бачиш, якість практично не постраждала, а розмір суттєво зменшився. Для JPG-зображень я завжди даю якість 75% – це оптимальний середній показник для даного типу зображень.

Друга команда – -density – задає роздільну здатність зображення, тобто кількість точок на дюйм. Важливо розуміти: це лише позначка у файлі, кількість пікселів від неї не змінюється. Вона впливає на те, якого розміру картинка вийде на папері: для друку зазвичай ставлять 300 т/д, а для екрана й сайту ця позначка майже нічого не означає.

convert tux.webp -density 72 tux16.webp
Оригінал – 300 dpi (для друку)
Оригінал – 300 dpi (для друку)
72 dpi (для виведення на екран)
72 dpi (для виведення на екран)

На екрані різниці ніякої, бо пікселі ті самі. А от на принтері перше зображення вийде маленьким і чітким, а друге – вчетверо більшим і помітно «розсипчастим» 😉

Об'єднуємо кілька зображень

Команда +append об'єднає зображення по горизонталі:

convert +append tux.webp tux12.webp tux13.webp tux14.webp -resize 50% -quality 75 tux17.webp

В даному коді я додатково зменшив зображення вдвічі та зменшив якість для економії місця.

+append

Команда -append об'єднає зображення по вертикалі. А я, користуючись висотою зображення, наперед розкланююсь. До нових зустрічей!

convert -append tux.webp tux12.webp tux13.webp tux14.webp -resize 50% -quality 75 tux18.webp

-append