До списку уроків
8A · Урок 7 з 16

Растр і вектор: піксель, dpi, вибір формату

виконано0%
Крок 1

Що робимо сьогодні

Модуль I · IT Skills (Hardware & Multimedia) · тема 4, урок 1 з 2 · 120 хвилин

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

Одна іконка на 16 пікселів. І банер на три метри. Файли для них потрібні різні.

До кінця уроку ти сам вибиратимеш формат — і зможеш назвати причину.

Після уроку ти вмієш

Слова «растр», «вектор», «dpi» й «альфа-канал» поки нічого не означають. Розберемо їх по черзі.

Хід уроку

ЕтапХвЩо робимо
Вхід: лупа по пікселях10Наближаємо фото до окремих квадратиків
Растр проти вектора20Одна фігура, спільний повзунок 1× → 32×
px, роздільна здатність, dpi25Калькулятор відбитка, дві задачі
Перерва10
Колір, альфа, артефакти JPEG20Три байти на піксель, прозорість, блоки 8×8
Перші кроки у власному терміналі25identify, magick -resize, identify.txt
Підсумок і ДЗ10Дерево рішень, домашнє завдання
Разом120
Головне правило модуля ImageMagick працює на твоєму комп'ютері, у теці media/lesson-04/. На сервер по FTP їде тільки текст: identify.txt, cmd.txt і index.html. Растрові файли вчитель дивиться очно, на твоєму екрані.
Чому тека зветься lesson-04, а урок — сьомий Теки практики звуться за темою, а не за номером уроку. Тема 4 — це уроки 7 і 8, і обидва складають роботу в одну теку lesson-04/. Не шукай lesson-07: її немає.
Крок 2

Піксель: зображення — це таблиця чисел

Комп'ютер не бачить «фото». Він бачить сітку і три числа в кожній клітинці

Уяви вишивку хрестиком. Кожна клітинка одного кольору, і нічого «між» клітинками немає.

Картинка у файлі влаштована так само. Це прямокутна сітка однакових клітинок.

Одна клітинка зветься пікселем, від англійського picture element. Вона зберігає рівно один колір.

Ніякої «фігури» чи «лінії» у файлі немає. Є тільки список кольорів по рядках.

Розмір сітки пишуть як ширина × висота: 1200 × 800, 1920 × 1080. Це і є роздільна здатність зображення.

Перемнож — вийде кількість пікселів. 1200 × 800 = 960 000, майже мегапіксель.

фотографія 1200 × 800 виділений шматок, збільшений у 40 разів один піксель — це три числа від 0 до 255 16 пікселів · 16 кольорів · більше в цьому шматку немає нічого
Наблизь будь-яке фото — і воно розсиплеться на квадратики. Це не дефект перегляду: у файлі справді лежить лише сітка кольорів. Помаранчевий піксель — це трійка 230, 126, 34; чорний — 0, 0, 0; білий — 255, 255, 255.

Звідси головна властивість растру. Деталей у ньому рівно стільки, скільки пікселів.

Розтягнути картинку — не означає додати деталі. Це означає зробити кожен квадратик більшим.

Питання

Ти взяв іконку 32 × 32 px і розтягнув її на всю ширину презентації. Чому вона стала «мильною»?

Крок 3

Растр і вектор: два способи зберегти одну картинку

Перший зберігає результат. Другий зберігає інструкцію, як його намалювати

Уяви два способи передати другові малюнок. Можна надіслати фото готового малюнка. А можна надіслати рецепт: де коло, якого воно радіуса, якого кольору.

Перший спосіб — це растр, сітка пікселів. Файл каже: «у клітинці 47-й зверху й 12-й зліва колір 230, 126, 34».

Так влаштовані JPEG, PNG, WebP, GIF, кадр із камери й скріншот екрана.

Другий спосіб — це вектор, список фігур із числами. Файл каже: «намалюй коло радіуса 20 в точці (44, 40), колір бірюзовий».

Так влаштований SVG, а ще шрифти й креслення. Пікселів у такому файлі немає взагалі.

Пікселі з'являються пізніше. Тоді, коли програма малює фігуру на конкретному екрані або принтері.

Різниця вилазить при збільшенні. Посунь повзунок: обидві панелі наближають ту саму фігуру.

Растр показує все більші квадрати. Вектор щоразу перемальовується заново.

Растр · PNG120 × 80 пікселів
Вектор · SVG2 фігури, 9 чисел
1,0×

Праворуч уся фігура описана дев'ятьма числами. Це центр і радіус кола плюс три вершини трикутника.

Скільки не наближай — програма перерахує їх під новий розмір. І намалює рівний край.

Ліворуч чисел 9600, по одному на піксель. Нових узятися нізвідки.

1× — усе зображення 16× Растр · 24 × 16 пікселів: 384 квадратики, і більше в файлі нічого немає Вектор · один рядок коду: коло радіуса 6 у точці (8, 8) — край рівний на будь-якому масштабі
Верхній ряд і нижній ряд на відстані витягнутої руки виглядають однаково. Різниця вилазить рівно тоді, коли зображення треба показати більшим, ніж воно було збережене.
РастрВектор
Що в файлісітка кольорів, по одному на піксельсписок фігур із координатами
Збільшеннявидно квадратикрай лишається рівним
Вага залежить відкількості пікселів і складності картинкикількості фігур, а не від розміру
Фотоєдиний придатний варіантнепридатний: мільйони фігур
Логотип, іконка, схематреба тримати кілька розміріводин файл на всі розміри
Редагуваннямалюєш пікселіправиш числа в текстовому редакторі
ФорматиJPEG, PNG, WebP, GIF, AVIFSVG, EPS, PDF (векторна частина)
Питання

Логотип школи дали у двох файлах. Це logo.png 512 × 512 і logo.svg на 6 КБ. Треба наліпку на двері 60 × 40 см. Який файл несеш у друк?

Крок 4

Пікселі, роздільна здатність і dpi

px нічого не каже про сантиметри, поки не з'явиться друк

Піксель — не одиниця довжини. У файлі «1200 px» означає лише «1200 клітинок у рядку». Скільки це сантиметрів — залежить від того, на чому їх покажуть.

Роздільна здатність екранів

НазваПікселівУсього
HD, 720p1280 × 7200,92 Мп
Full HD, 1080p1920 × 10802,07 Мп
QHD, 1440p2560 × 14403,69 Мп
4K UHD, 2160p3840 × 21608,29 Мп

ppi і dpi

Уяви два клітчасті зошити. В одному клітинки по 5 мм, у другому по 3 мм. На тій самій сторінці другий зошит умістить більше клітинок.

З пікселями так само. Питання лише в тому, скільки їх кладуть на один дюйм.

ppi — це pixels per inch. Скільки пікселів припадає на дюйм екрана або відбитка.

dpi — це dots per inch. Скільки крапок фарби кладе принтер на той самий дюйм.

У побуті обидві абревіатури вживають як синоніми. У друкарні ти почуєш саме «dpi».

Дюйм — це рівно 25,4 мм, так домовилися 1959 року.

Звідси єдина формула, яка потрібна на цьому уроці:

Розмір відбитка сантиметри = пікселі ÷ dpi × 2,54.
Навпаки: пікселі = сантиметри ÷ 2,54 × dpi.

Приклад. Візьмімо фото 3000 × 2000 і друк на 300 dpi.

Ширина: 3000 ÷ 300 = 10 дюймів, тобто 25,4 см. Висота: 2000 ÷ 300 ≈ 6,67 дюйма, тобто 16,9 см.

Той самий файл при 150 dpi дасть відбиток удвічі більший. І вдвічі грубіший.

Один файл, 1200 пікселів завширшки — три різні фізичні розміри Екран ноутбука · 96 ppi → 31,75 см Плакат на стіні · 150 dpi → 20,32 см Журнал у руках · 300 dpi → 10,16 см 0 5 10 15 20 25 30 см
Файл не змінився — змінилася лише вказівка «скільки пікселів класти на дюйм». Тому фраза «фото на 300 dpi» без фізичного розміру не означає нічого.

Порахуй сам

Чому на екрані dpi не працює

У PNG є службовий блок pHYs. У JPEG — поля щільності в заголовку JFIF. Туди можна записати «300 dpi».

Браузер це ігнорує. Він малює картинку на 1200 пікселів у 1200 умовних пікселів сторінки, і крапка.

Візьми два однакові файли 1200 × 800. На одному мітка 72 dpi, на другому 300 dpi.

На сайті вони виглядають однаково й важать однаково. Мітка оживає лише в друку або у верстці.

Пастка з банером Банер 3 × 2 метри при «поліграфічних» 300 dpi — це 35 433 × 23 622 пікселі, тобто 837 мегапікселів і приблизно 2,5 ГБ нестисненого растру. Такий файл ніхто не приймає. Банери друкують із 20–40 dpi, бо їх дивляться з 5–10 метрів, а логотип для них дають вектором.
Питання

Логотип треба надрукувати на банері 3 × 2 метри. Який файл ти несеш у друкарню і чому?

Крок 5

Колір, альфа-канал і вага пікселя

Три байти на клітинку — і звідси вся арифметика розміру

Колір пікселя збирають із трьох складників: червоного, зеленого й синього. Як фарби на палітрі.

Кожен складник зберігають одним байтом. Це число від 0 до 255.

Три байти дають 224 = 16 777 216 кольорів. Таку глибину звуть truecolor, або «8 біт на канал».

R · червоний G · зелений B · синій A · прозорість 1 байт · 0—255 1 байт · 0—255 1 байт · 0—255 1 байт · є не всюди байт 1 байт 2 байт 3 байт 4 3 байти = 24 біти = 16 777 216 кольорів · з альфою 4 байти = 32 біти PNG і WebP уміють четвертий байт · JPEG — ні · GIF має замість нього один біт «видно / не видно»
Це вміст одного пікселя в пам'яті. Формати зображень відрізняються насамперед тим, як вони пакують мільйони таких четвірок.

Формула ваги нестисненого растру

байтів = ширина × висота × байтів на піксель Для звичайного RGB множник 3, для RGBA — 4. Це «сира» вага, до будь-якого стиснення: саме стільки місця картинка займає в пам'яті, коли її вже розпаковано.
ЗображенняПікселівСира вага, RGB
іконка 64 × 644 09612,3 КБ
джерело уроку 1200 × 800960 0002,88 МБ
кадр Full HD 1920 × 10802 073 6006,22 МБ
кадр 4K 3840 × 21608 294 40024,88 МБ
знімок камери 6000 × 400024 000 00072,0 МБ

Останній рядок пояснює, навіщо взагалі потрібні формати зі стисненням.

А тепер візьми 4K і 25 кадрів на секунду. Вийде 622 МБ на кожну секунду відео.

Саме тому наступна тема буде про кодеки.

Питання

Ти зберігаєш кадри 6000 × 4000 без стиснення, по 3 байти на піксель. На флешці вільно 500 МБ. Скільки таких кадрів туди влізе?

Альфа-канал: прозорість

Уяви скло у вікні. Крізь чисте видно все, крізь матове — розмито, крізь зафарбоване — нічого.

Четвертий байт пікселя задає рівно це. Він зветься альфа-каналом.

0 — пікселя не видно зовсім. 255 — він повністю закриває те, що під ним.

Проміжні значення дають напівпрозорість. Це м'які тіні, згладжені краї літер, скло.

Формати вміють різне. PNG і WebP тримають усі 256 рівнів.

GIF має лише один біт: піксель або видно повністю, або не видно взагалі. Звідси зубчасті краї старих гіфок.

JPEG прозорості не має взагалі. Причина — у самому стандарті ITU-T T.81 від 1992 року.

Він описує яскравість і дві колірні різниці. Каналу прозорості там просто не передбачено.

Тому при збереженні прозорі ділянки заливають фоном. Зазвичай білим або чорним.

Питання

Дизайнер прислав логотип у PNG із прозорим тлом. Ти пересохранив його у JPEG і поклав на синій банер. Що ти побачиш?

Звідки беруться артефакти JPEG

JPEG стискає з втратами. Робить він це в чотири кроки.

Крок 1. Переводить картинку з RGB у яскравість плюс два колірні канали.

Крок 2. Часто зберігає колір у вчетверо дрібнішій сітці. Це звуть 4:2:0: око гірше бачить колір, ніж яскравість.

Крок 3. Ділить зображення на квадрати 8 × 8 пікселів.

Крок 4. Викидає в кожному квадраті найдрібніші деталі.

Що сильніше викидати, то легший файл. І то помітніші сліди.

На рівному небі проступають квадрати 8 × 8. Навколо контрастних країв з'являється сірий «дзвін», особливо навколо тексту.

Силу стиснення задає параметр -quality, від 0 до 100. Це не відсотки, а номер набору таблиць округлення.

Орієнтири прості. 90 і вище — різницю видно хіба що при збільшенні.

75–85 — робочий діапазон для вебу. Нижче 50 — артефакти видно неозброєним оком.

Втрати накопичуються Кожне перезбереження JPEG — це нове округлення поверх попереднього. Відкрив, трохи підправив, зберіг — і так десять разів: картинка помітно «попливе». Робочий файл тримають у PNG, а JPEG роблять останнім кроком.
Крок 6

П'ять форматів і як обрати потрібний

У кожного своя робота; «найкращого взагалі» не буває

ФорматСтисненняПрозорістьАнімаціяСильний у
JPEGз втратаминемаєнемаєфото й усе, де плавні переходи
PNGбез втрат256 рівнівнемаєскріншоти, схеми, текст, прозорість
WebPобидва режими256 рівнівєвеб: легший і за JPEG, і за PNG
SVGвектор, це текстєєлоготипи, іконки, схеми, графіки
GIFбез втрат, 256 кольорів1 бітєнічого нового; лишився за звичкою

JPEG — 1992 рік і досі скрізь

Стандарт зветься ITU-T T.81 / ISO 10918-1. Його рахували саме під фотографію.

На фото сусідні пікселі майже завжди схожі. Тому дрібні відмінності можна викинути майже непомітно.

Фото 1200 × 800 у JPEG якості 85 важить 150–250 КБ.

Трьох речей JPEG не вміє. Перша — прозорість: порожнє місце він однаково заллє білим.

Друга — різкі лінії. Букви й рамки JPEG розмиває, а навколо них проступають сірі ореоли.

Третя — перезбереження. Кожне «зберегти» відкидає нову порцію даних, і після п'ятого разу фото псується помітно.

Звідси правило: у JPEG кладуть готове фото, а не робочий файл, який ще редагуватимуть.

PNG — точна копія, байт у байт

PNG стискає без втрат. Розпакував — отримав рівно те, що зберігав.

Усередині фільтрація рядків і той самий алгоритм DEFLATE, що в ZIP. Плюс повноцінний альфа-канал.

Чому ж PNG погано стискає фото? Бо DEFLATE шукає повтори.

У знімку з камери сусідні пікселі майже ніколи не збігаються точно. Заважає шум матриці.

Повторів немає — і економити нема на чому. Те саме фото 1200 × 800 у PNG легко займе 1,5–2,5 МБ.

Це вдесятеро більше за JPEG.

Зате на скріншоті, схемі чи тексті все навпаки. Там цілі рядки однакових пікселів повторюються сотнями.

Тому PNG виграє в JPEG і за вагою, і за чіткістю.

WebP — компроміс від Google, 2010

WebP уміє обидва режими. З втратами, як JPEG. І без втрат, як PNG.

В обох режимах він тримає прозорість. Цим він сильніший за JPEG.

За вимірюваннями Google, без втрат WebP приблизно на 26% менший за PNG.

З втратами він на 25–34% менший за JPEG при тій самій якості на око.

Підтримують усі сучасні браузери. Chrome і Edge давно, Firefox з 65-ї версії, Safari з 14-ї, це 2020 рік.

Обмеження одне: максимум 16 383 пікселі по стороні.

SVG — малюнок, який можна прочитати

SVG — це звичайний текстовий файл у форматі XML.

Його можна відкрити в блокноті. Знайти потрібний колір пошуком і замінити. Перефарбувати з CSS. Анімувати.

Логотип у SVG важить одиниці кілобайтів. І однаково чіткий на фавіконі 16 px і на шестиметровому банері.

Атрибут viewBox задає малюнку власну систему координат. Саме завдяки йому один файл лягає в будь-який розмір без спотворень.

Для фото SVG непридатний. Описати кожен піксель окремою фігурою — це файл, більший за растр.

GIF — 1987 рік, лишився тільки заради анімації

На один кадр GIF бере лише 256 кольорів. Фото в ньому вкривається плямами: плавний перехід неба просто немає з чого скласти.

Прозорість тут однобітна. Тобто піксель або видно повністю, або не видно зовсім.

М'якої напівпрозорої тіні GIF не вміє. По краю круглої іконки лишаються східці.

Стискає він теж слабко — алгоритм 1987 року. Той самий кадр у WebP важить у кілька разів менше.

Тому анімацію сьогодні роблять у WebP або коротким відео. GIF лишається там, де його вимагає стара платформа.

Питання

Ти зняв фото 1200 × 800 і зберіг його двічі. У PNG вийшло 2,1 МБ, у JPEG якості 85 — 180 КБ. Що кладеш у галерею сайту?

Дерево рішень

Що зображено? Фото, складна текстура Фото з прозорістю Логотип, іконка, схема, графік Скріншот, текст, різкі лінії Коротка анімація JPEG · q 75—85 WebP · PNG SVG PNG · WebP WebP · відео Правило коротко: усе, що можна описати фігурами, — вектор; усе, що знято камерою, — растр. WebP підходить майже всюди в вебі, але для друку його досі просять замінити на JPEG, PNG або SVG.
Дерево читається згори вниз одним запитанням: що саме на картинці. Формат випливає з відповіді, а не з думки «який кращий».
Питання

Скріншот уроку з дрібним текстом ти зберіг у JPEG якості 60. Навколо букв з'явилися сірі ореоли. Що робити?

Крок 7

ImageMagick: читаємо й переробляємо зображення командою

Усе з цього кроку набирається у твоєму терміналі, у теці media/lesson-04/ — не на сервері

Де ти зараз перебуваєш Термінал уміє працювати не тільки з твоїм комп'ютером. Одна команда — і він віддає все, що ти набираєш, серверу курсу за сотні кілометрів. Такий режим зветься SSH-сесією. Упізнати його легко: у запрошенні перед курсором стоїть ім'я сервера, а не твоє. Якщо бачиш його — набери exit і повернешся до себе. ImageMagick стоїть тільки в тебе на комп'ютері, на сервері його для учнів немає.

ImageMagick — це набір інструментів для зображень, які працюють без вікон і мишки. Нам потрібні два.

identify читає параметри файлу. magick перетворює його.

У сьомій версії головна команда зветься magick, у шостій — convert. На нових машинах працює перша.

твій термінал · перевірка інструмента
$ magick -version Version: ImageMagick 7.1.1-39 Q16-HDRI x86_64 Delegates (built-in): freetype jpeg png webp zlib $ magick -list format | findstr /i webp WEBP rw+ WebP Image Format

Шукай слово webp у рядку Delegates. І рядок WEBP у списку форматів.

Обидва на місці — WebP підтримується. Немає — підніми руку зараз: наступного уроку WebP знадобиться, а доставити його на перерві не встигнеш.

На macOS і Linux замість findstr /i webp пиши grep -i webp.

Читаємо вивід identify

твій термінал · media/lesson-04
$ identify source.png source.png PNG 1200x800 1200x800+0+0 8-bit sRGB 1.48MB 0.010u 0:00.008
Що у виводіЩо це означає
source.pngім'я файлу
PNGсправжній формат — визначений за вмістом, а не за розширенням
1200x800розмір у пікселях
1200x800+0+0розмір «полотна» і зсув зображення на ньому
8-bit8 бітів на канал, тобто 256 градацій кожного кольору
sRGBколірний простір
1.48MBвага файлу на диску

Щоб вивід був машиночитним, задають власний шаблон ключем -format. Кожен «відсоток із літерою» — це підстановка:

твій термінал · власний шаблон виводу
$ identify -format "%f %w %h %m %z-bit %[colorspace] %b\n" source.png source.png 1200 800 PNG 8-bit sRGB 1.48MB
КлючЩо підставляє
%fім'я файлу
%wширину в пікселях
%hвисоту в пікселях
%mформат: PNG, JPEG, WEBP…
%zглибину каналу в бітах
%[colorspace]колірний простір: sRGB, Gray, CMYK
%bвагу файлу
%Aчи є в зображенні альфа-канал
\nперехід на новий рядок — інакше все злипнеться в один

Зберігаємо вивід у файл

Саме цей текстовий файл поїде на сервер. Він легкий, і чекер зможе звірити числа.

Файлів у команді може бути кілька. Кожен дасть свій рядок.

твій термінал · identify.txt
# Windows PowerShell: пишемо в UTF-8, інакше вийде UTF-16 і чекер нічого не знайде $ identify -format "%f %w %h %m %b\n" source.png thumb.jpg | Out-File -Encoding utf8 identify.txt # macOS та Linux $ identify -format "%f %w %h %m %b\n" source.png thumb.jpg > identify.txt

Змінюємо розмір

твій термінал · зменшена копія
$ magick source.png -resize 300x200 -quality 85 thumb.jpg $ identify -format "%w %h %m %b\n" thumb.jpg 300 200 JPEG 18.4KB

Порядок аргументів у ImageMagick має значення. Спочатку вхідний файл, потім дії над ним, останнім — файл результату.

Формат результату визначає розширення. Написав .jpg — отримав JPEG.

КлючЩо робить
-resize 300x200вписує зображення в прямокутник 300 × 200, зберігаючи пропорції
-resize 300x200!робить рівно 300 × 200, навіть якщо картинка спотвориться
-resize 50%зменшує вдвічі за обома сторонами
-quality 85якість JPEG або WebP, 0—100
-stripвикидає службові дані (EXIF, GPS) — файл легшає
Чому вийшло 267 × 200, а не 300 × 200 Наше джерело 1200 × 800 має пропорції 3:2, тому -resize 300x200 дає рівно 300 × 200. А фото 4000 × 3000 — це 4:3, і в той самий прямокутник воно впишеться як 267 × 200. Точний розмір примушує знак оклику.
твій термінал · пропорції проти точного розміру
# фото 4000x3000, пропорції 4:3 $ magick photo.jpg -resize 300x200 small.jpg $ identify -format "%w %h\n" small.jpg 267 200 # знак оклику примушує точний розмір; у PowerShell бери аргумент в одинарні лапки $ magick photo.jpg -resize '300x200!' small-exact.jpg
Питання

Фото 4000 × 3000. Ти виконав magick photo.jpg -resize 300x200 small.jpg. А identify показав 267 × 200. Це помилка?

Крок 8

Практика: від джерела до звіту

Кроки 1—8 — у твоєму терміналі, кроки 9—12 — сторінка й сервер. Галочки зберігаються, сторінку можна закрити.

Що нікуди не завантажується source.png і thumb.jpg лишаються в локальній теці media/lesson-04/. FTP-приймальня не приймає зображення понад 500 КБ і будь-що понад 2 МБ — це технічне обмеження. На сервер їдуть тільки index.html, identify.txt і cmd.txt.
Крок 9

Автоперевірка

Чекер зайде у твій кабінет і звірить звіт сам із собою. Це перша половина перевірки теми, друга буде наступного уроку. Спроби не обмежені.

Демонстраційний режим: результат згенеровано для показу. На сервері ця кнопка викликає POST /api/check, який запускає check 04 від імені учня.

Що вчитель дивиться на екрані

Крок 10

Шкала виконання

Це те, що бачить учитель, коли виставляє оцінку.

СкладникВагаРезультат
Виконано
0%
Рекомендований бал за 12-бальною

Чотири речення, які варто запам'ятати

Де найчастіше помиляються

Домашнє завдання

Знайди навколо себе чотири реальні зображення. Іконку застосунку на телефоні. Фотографію. Скріншот із текстом. Логотип бренду.

Для кожного запиши одним реченням, який формат доречний і чому саме.

Спирайся на те, що сьогодні порахував: прозорість, різкі краї, вага, потреба масштабувати.

Відповіді неси в зошиті. На початку наступного уроку 4—5 учнів аргументуватимуть свій вибір, а решта наводитиме контраргументи.

Джерела

Звідки взяті числа

Усі значення на цій сторінці — з відкритих стандартів і офіційної документації. Перевіряти дозволено й корисно.

Повний список із поясненнями і всі проміжні розрахунки — у файлі urok-07-джерела.md поруч із цією сторінкою.