Робота із зображеннями

Клас Nette\Utils\Image спрощує маніпуляції із зображеннями, такі як зміна розміру, обрізка, підвищення різкості, малювання або об'єднання кількох зображень.

PHP має великий набір функцій для маніпуляції зображеннями. Але їхній API не дуже зручний. Це був би не Nette Framework, якби він не запропонував сексуальний API.

Встановлення:

composer require nette/utils

Усі приклади передбачають створений псевдонім:

use Nette\Utils\Image;
use Nette\Utils\ImageColor;
use Nette\Utils\ImageType;

Створення зображення

Створимо нове true color зображення, наприклад, з розмірами 100×200:

$image = Image::fromBlank(100, 200);

За бажанням можна вказати колір фону (за замовчуванням чорний):

$image = Image::fromBlank(100, 200, ImageColor::rgb(125, 0, 0));

Або завантажимо зображення з файлу:

$image = Image::fromFile('nette.jpg');

Збереження зображення

Зображення можна зберегти у файл:

$image->save('resampled.jpg');

Ми можемо вказати якість стиснення в діапазоні 0..100 для JPEG (за замовчуванням 85), WEBP (за замовчуванням 80) та AVIF (за замовчуванням 30) і 0..9 для PNG (за замовчуванням 9):

$image->save('resampled.jpg', 80); // JPEG, якість 80%

Якщо з розширення файлу не зрозумілий формат, його можна вказати константою:

$image->save('resampled.tmp', null, ImageType::JPEG);

Зображення можна замість диска записати у змінну:

$data = $image->toString(ImageType::JPEG, 80); // JPEG, якість 80%

або надіслати безпосередньо в браузер із відповідним HTTP заголовком Content-Type:

// надсилає заголовок Content-Type: image/png
$image->send(ImageType::PNG);

Формати

Підтримувані формати: JPEG, PNG, GIF, WebP, AVIF та BMP, однак їх також має підтримувати ваша версія PHP, що можна перевірити функцією isTypeSupported(). Анімація не підтримується.

Формат представлений константами ImageType::JPEG, ImageType::PNG, ImageType::GIF, ImageType::WEBP, ImageType::AVIF та ImageType::BMP.

$supported = Image::isTypeSupported(ImageType::JPEG);

Потрібно визначити формат зображення під час завантаження? Метод поверне його у другому параметрі:

$image = Image::fromFile('nette.jpg', $type);

Саме визначення без завантаження зображення виконує Image::detectTypeFromFile().

Зміна розміру

Частою операцією є зміна розмірів зображення. Поточні розміри повертають методи getWidth() та getHeight().

Для зміни служить метод resize(). Приклад пропорційної зміни розміру так, щоб він не перевищував розміри 500×300 пікселів (або ширина буде точно 500 px, або висота буде точно 300 px, один із розмірів обчислюється так, щоб зберегти співвідношення сторін):

$image->resize(500, 300);

Можна вказати лише один розмір, а другий обчислиться:

$image->resize(500, null); // ширина 500px, висота обчислюється

$image->resize(null, 300); // ширина обчислюється, висота 300px

Будь-який розмір можна вказати також у відсотках:

$image->resize('75%', 300); // 75 % × 300px

Поведінку resize можна змінити за допомогою таких прапорців. Усі, крім Image::Stretch, зберігають співвідношення сторін.

Прапорець Опис
Image::OrSmaller (за замовчуванням) кінцеві розміри будуть меншими або рівними заданим розмірам
Image::OrBigger заповнює (і, можливо, перевищує в одному вимірі) цільову область
Image::Cover заповнює цільову область і обрізає те, що виходить за межі
Image::ShrinkOnly тільки зменшення (запобігає розтягуванню маленького зображення)
Image::Stretch не зберігати співвідношення сторін

Прапорці вказуються як третій аргумент функції:

$image->resize(500, 300, Image::OrBigger);

Прапорці можна комбінувати:

$image->resize(500, 300, Image::ShrinkOnly | Image::Stretch);

Зображення можна вертикально або горизонтально перевернути, вказавши один із розмірів (або обидва) як від'ємне число:

$flipped = $image->resize(null, '-100%'); // перевернути вертикально

$flipped = $image->resize('-100%', '-100%'); // повернути на 180°

$flipped = $image->resize(-125, 500); // змінити розмір і перевернути горизонтально

Після зменшення зображення можна покращити його вигляд легким підвищенням різкості:

$image->sharpen();

Обрізка

Для обрізки служить метод crop():

$image->crop($left, $top, $width, $height);

Подібно до resize(), усі значення можуть бути вказані у відсотках. Відсотки для $left та $top обчислюються з решти місця, подібно до CSS властивості background-position:

$image->crop('100%', '50%', '80%', '80%');

Зображення також можна обрізати автоматично, наприклад, обрізати чорні краї:

$image->cropAuto(IMG_CROP_BLACK);

Метод cropAuto() є об'єктною заміною функції imagecropauto(), в її документації ви знайдете додаткову інформацію.

Кольори

Метод ImageColor::rgb() дозволяє визначити колір за допомогою значень червоного, зеленого та синього (RGB). За бажанням ви також можете вказати значення прозорості в діапазоні від 0 (повністю прозорий) до 1 (повністю непрозорий), так само, як у CSS.

$color = ImageColor::rgb(255, 0, 0); // Червоний
$transparentBlue = ImageColor::rgb(0, 0, 255, 0.5); // Напівпрозорий синій

Метод ImageColor::hex() дозволяє визначити колір за допомогою шістнадцяткового формату, подібно до CSS. Підтримує формати #rgb, #rrggbb, #rgba та #rrggbbaa:

$color = ImageColor::hex("#F00"); // Червоний
$transparentGreen = ImageColor::hex("#00FF0080"); // Напівпрозорий зелений

Кольори можна використовувати в інших методах, таких як ellipse(), fill() тощо.

Малювання та редагування

Можеш малювати, можеш писати, але листя не рвати. Вам доступні всі функції PHP для роботи із зображеннями, див. Přehled metod, але в об'єктній обгортці:

$image->filledEllipse($centerX, $centerY, $width, $height, ImageColor::rgb(255, 0, 0));

Оскільки функції PHP для малювання прямокутників непрактичні через визначення координат, клас Image пропонує їхні заміни у вигляді функцій rectangleWH() та filledRectangleWH().

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

В зображення можна легко вставити інше зображення:

$logo = Image::fromFile('logo.png');
$blank = Image::fromBlank(320, 240, ImageColor::rgb(52, 132, 210));

// координати можна вказати знову у відсотках
$blank->place($logo, '80%', '80%'); // вставимо поблизу правого нижнього кута

При вставці враховується альфа-канал, крім того, ми можемо впливати на прозорість вставлюваного зображення (створимо так званий водяний знак):

$blank->place($image, '80%', '80%', 25); // прозорість 25 %

Такий API справді приємно використовувати!

Огляд методів

static fromBlank (int $width, int $height, ?ImageColor $color=null)Image

Створює нове true color зображення заданих розмірів. Колір за замовчуванням — чорний.

static fromFile (string $file, int &$detectedFormat=null)Image

Завантажує зображення з файлу і повертає його тип у $detectedFormat.

static fromString (string $s, int &$detectedFormat=null)Image

Завантажує зображення з рядка і повертає його тип у $detectedFormat.

static rgb (int $red, int $green, int $blue, int $transparency=0)array

Цю функцію замінив клас ImageColor, див. кольори.

static typeToExtension (int $type)string

Повертає розширення файлу для даного типу.

static typeToMimeType (int $type)string

Повертає mime-тип для даного типу.

static extensionToType (string $extension)int

Повертає тип зображення за розширенням файлу.

static detectTypeFromFile (string $file, int &$width=null, int &$height=null)?int

Повертає тип зображення, а в параметрах $width та $height також його розміри.

static detectTypeFromString (string $s, int &$width=null, int &$height=null)?int

Повертає тип зображення з рядка, а в параметрах $width та $height також його розміри.

static isTypeSupported (int $type)bool

Перевіряє, чи підтримується даний тип зображення.

static getSupportedTypes(): array

Повертає масив підтримуваних типів зображення.

static calculateTextBox (string $text, string $fontFile, float $size, float $angle=0, array $options=[])array

Обчислює розміри прямокутника, який охоплює текст певним шрифтом та розміром. Повертає асоціативний масив, що містить ключі left, top, width, height. Лівий край може бути від'ємним, якщо текст починається з лівого підрізання.

affine (array $affine, ?array $clip=null)Image

Повертає зображення, що містить афінно трансформоване зображення src, використовуючи необов'язкову область обрізки. (більше).

affineMatrixConcat (array $m1, array $m2)array

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

affineMatrixGet (int $type, ?mixed $options=null)array

Повертає матрицю трансформації. (більше)

alphaBlending (bool $on)void

Дозволяє два різних режими малювання в зображеннях truecolor. У режимі змішування компонент альфа-каналу кольору, що використовується у всіх функціях малювання, таких як setPixel(), визначає, наскільки має бути дозволено просвічування основного кольору. В результаті існуючий колір автоматично змішується з кольором малювання в цій точці, і результат зберігається в зображенні. Отриманий піксель є непрозорим. У режимі без змішування колір малювання копіюється буквально з інформацією про альфа-канал і замінює цільовий піксель. Режим змішування недоступний при малюванні на палітрових зображеннях. (більше)

antialias (bool $on): void

Активуйте малювання згладжених ліній та полігонів. Не підтримує альфа-канали. Працює тільки з зображеннями truecolor.

Використання згладжених примітивів з прозорим кольором фону може призвести до несподіваних результатів. Метод змішування використовує колір фону так само, як і всі інші кольори. (більше)

arc (int $centerX, int $centerY, int $width, int $height, int $startAngle, int $endAngle, ImageColor $color)void

Малює дугу кола з центром у заданих координатах. (більше)

colorAllocate (int $red, int $green, int $blue)int

Повертає ідентифікатор кольору, що представляє колір, складений із заданих компонентів RGB. Має бути викликаний для створення кожного кольору, який буде використовуватися в зображенні. (більше)

colorAllocateAlpha (int $red, int $green, int $blue, int $alpha)int

Поводиться так само, як colorAllocate(), з додаванням параметра прозорості $alpha. (більше)

colorAt (int $x, int $y)int

Повертає індекс кольору пікселя у вказаному місці зображення. Якщо зображення є truecolor, ця функція повертає значення RGB цього пікселя як ціле число. Використовуйте бітовий зсув та бітову маску для доступу до окремих значень червоної, зеленої та синьої компонент: (більше)

colorClosest (int $red, int $green, int $blue)int

Повертає індекс кольору в палітрі зображення, який є «найближчим» до заданого значення RGB. “Відстань” між бажаним кольором та кожним кольором у палітрі обчислюється так, ніби значення RGB представляють точки в тривимірному просторі. (більше)

colorClosestAlpha (int $red, int $green, int $blue, int $alpha)int

Повертає індекс кольору в палітрі зображення, який є «найближчим» до заданого значення RGB та рівня $alpha. (більше)

colorClosestHWB (int $red, int $green, int $blue)int

Отримайте індекс кольору, який має відтінок, білий та чорний колір, найближчі до заданого кольору. (більше)

colorDeallocate (int $color)void

Де-алокує колір, раніше виділений за допомогою colorAllocate() або colorAllocateAlpha(). (більше)

colorExact (int $red, int $green, int $blue)int

Повертає індекс заданого кольору в палітрі зображення. (більше)

colorExactAlpha (int $red, int $green, int $blue, int $alpha)int

Повертає індекс заданого кольору + альфа в палітрі зображення. (більше)

colorMatch (Image $image2)void

Пристосовує кольори палітри до другого зображення. (більше)

colorResolve (int $red, int $green, int $blue)int

Повертає індекс кольору для бажаного кольору, або точний колір, або найближчу можливу альтернативу. (більше)

colorResolveAlpha (int $red, int $green, int $blue, int $alpha)int

Повертає індекс кольору для бажаного кольору, або точний колір, або найближчу можливу альтернативу. (більше)

colorSet (int $index, int $red, int $green, int $blue)void

Встановлює заданий індекс у палітрі на заданий колір. (більше)

colorsForIndex (int $index)array

Отримує колір зазначеного індексу. (більше)

colorsTotal(): int

Повертає кількість кольорів у палітрі зображення. (більше)

colorTransparent (?int $color=null)int

Отримує або встановлює прозорий колір у зображенні. (більше)

convolution (array $matrix, float $div, float $offset)void

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

Потребує наявності Bundled GD extension, тому може працювати не скрізь.

copy (Image $src, int $dstX, int $dstY, int $srcX, int $srcY, int $srcW, int $srcH)void

Копіює частину $src на зображення, починаючи з координат $srcX, $srcY з шириною $srcW та висотою $srcH. Визначена частина буде скопійована на координати $dstX та $dstY. (більше)

copyMerge (Image $src, int $dstX, int $dstY, int $srcX, int $srcY, int $srcW, int $srcH, int $opacity)void

Копіює частину $src на зображення, починаючи з координат $srcX, $srcY з шириною $srcW та висотою $srcH. Визначена частина буде скопійована на координати $dstX та $dstY. (більше)

copyMergeGray (Image $src, int $dstX, int $dstY, int $srcX, int $srcY, int $srcW, int $srcH, int $opacity)void

Копіює частину $src на зображення, починаючи з координат $srcX, $srcY з шириною $srcW та висотою $srcH. Визначена частина буде скопійована на координати $dstX та $dstY.

Ця функція ідентична copyMerge(), за винятком того, що при злитті зберігає відтінок джерела, перетворюючи цільові пікселі на сіру шкалу перед операцією копіювання. (більше)

copyResampled (Image $src, int $dstX, int $dstY, int $srcX, int $srcY, int $dstW, int $dstH, int $srcW, int $srcH)void

Копіює прямокутну частину одного зображення на інше зображення, плавно інтерполюючи значення пікселів, так що, зокрема, зменшення розміру зображення все ще зберігає велику чіткість.

Іншими словами, copyResampled() бере прямокутну область з $src шириною $srcW та висотою $srcH в позиції ($srcX, $srcY) і розміщує її в прямокутній області зображення шириною $dstW та висотою $dstH в позиції ($dstX, $dstY).

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

copyResized (Image $src, int $dstX, int $dstY, int $srcX, int $srcY, int $dstW, int $dstH, int $srcW, int $srcH)void

Копіює прямокутну частину одного зображення на інше зображення. Іншими словами, copyResized() отримує прямокутну область з $src шириною $srcW та висотою $srcH в позиції ($srcX, $srcY) і розміщує її в прямокутній області зображення шириною $dstW ] та висотою $dstH в позиції ($dstX, $dstY).

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

crop (int|string $left, int|string $top, int|string $width, int|string $height)Image

Обрізає зображення до заданої прямокутної області. Розміри можна задавати як цілі числа в пікселях або рядки у відсотках (наприклад, '50%').

cropAuto (int $mode=-1, float $threshold=.5, ?ImageColor $color=null)Image

Автоматично обрізає зображення відповідно до заданого $mode. (більше)

ellipse (int $centerX, int $centerY, int $width, int $height, ImageColor $color)void

Малює еліпс з центром у заданих координатах. (більше)

fill (int $x, int $y, ImageColor $color)void

Заповнює область, починаючи з заданої координати (лівий верхній кут — 0, 0), заданим $color. (більше)

filledArc (int $centerX, int $centerY, int $width, int $height, int $startAngle, int $endAngle, ImageColor $color, int $style)void

Малює часткову дугу з центром у заданих координатах. (більше)

filledEllipse (int $centerX, int $centerY, int $width, int $height, ImageColor $color)void

Малює еліпс з центром у заданих координатах. (більше)

filledPolygon (array $points, ImageColor $color)void

Створює в зображенні заповнений багатокутник. (більше)

filledRectangle (int $x1, int $y1, int $x2, int $y2, ImageColor $color)void

Створює прямокутник, заповнений $color в зображенні, починаючи з точки $x1 & $y1 і закінчуючи точкою $x2 & $y2. Точка 0, 0 — це лівий верхній кут зображення. (більше)

filledRectangleWH (int $left, int $top, int $width, int $height, ImageColor $color)void

Створює прямокутник, заповнений $color в зображенні, починаючи з точки $left & $top з шириною $width та висотою $height. Точка 0, 0 — це лівий верхній кут зображення.

fillToBorder (int $x, int $y, int $border, ImageColor $color)void

Виконує заливку, колір межі якої визначено за допомогою $border. Початковою точкою заливки є $x, $y (лівий верхній кут — 0, 0), а область заповнюється кольором $color. (більше)

filter (int $filtertype, int …$args)void

Застосовує заданий фільтр $filtertype до зображення. (більше)

flip (int $mode): void

Перевертає зображення за допомогою заданого $mode. (більше)

ftText (float $size, float $angle, int $x, int $y, ImageColor $color, string $fontFile, string $text, array $options=[])array

Написати текст на зображенні. (більше)

gammaCorrect (float $inputgamma, float $outputgamma)void

Застосовує гамма-корекцію до зображення відносно вхідної та вихідної гамми. (більше)

getClip(): array

Повертає поточну область обрізки, тобто область, за межами якої не будуть намальовані жодні пікселі. (більше)

getHeight(): int

Повертає висоту зображення.

getImageResource(): resource|GdImage

Повертає оригінальний ресурс.

getWidth(): int

Повертає ширину зображення.

interlace (?int $interlace=null)int

Вмикає або вимикає режим черезрядкової розгортки. Якщо режим черезрядкової розгортки встановлено і зображення зберігається як JPEG, воно буде збережено як прогресивний JPEG. (більше)

isTrueColor(): bool

Визначає, чи є зображення truecolor. (більше)

layerEffect (int $effect)void

Встановіть прапорець змішування альфа, щоб використовувати ефекти шарів. (більше)

line (int $x1, int $y1, int $x2, int $y2, ImageColor $color)void

Малює лінію між двома заданими точками. (більше)

openPolygon (array $points, ImageColor $color)void

Малює на зображенні відкритий багатокутник. На відміну від polygon(), між останньою та першою точкою лінія не малюється. (більше)

paletteCopy (Image $source)void

Копіює палітру з $source до зображення. (більше)

paletteToTrueColor(): void

Перетворює зображення на основі палітри на повнокольорове зображення. (більше)

place (Image $image, int|string $left=0, int|string $top=0, int $opacity=100)Image

Копіює $image до зображення на координати $left та $top. Координати можна задавати як цілі числа в пікселях або рядки у відсотках (наприклад, '50%').

polygon (array $points, ImageColor $color)void

Створює в зображенні багатокутник. (більше)

rectangle (int $x1, int $y1, int $x2, int $y2, ImageColor $color)void

Створює прямокутник на заданих координатах. (більше)

rectangleWH (int $left, int $top, int $width, int $height, ImageColor $color)void

Створює прямокутник на заданих координатах.

resize (int|string $width, int|string $height, int $flags=Image::OrSmaller)Image

Змінює розмір зображення, більше інформації. Розміри можна задавати як цілі числа в пікселях або рядки у відсотках (наприклад, '50%').

resolution (?int $resX=null, ?int $resY=null)mixed

Встановлює або повертає роздільну здатність зображення в DPI (точки на дюйм). Якщо не задано жодного з необов'язкових параметрів, поточна роздільна здатність повертається як індексований масив. Якщо задано лише $resX, горизонтальна та вертикальна роздільна здатність встановлюються на це значення. Якщо задано обидва необов'язкові параметри, горизонтальна та вертикальна роздільна здатність встановлюються на ці значення.

Роздільна здатність використовується лише як метаінформація, коли зображення читаються та записуються у формати, що підтримують цей тип інформації (наразі PNG та JPEG). Це не впливає на жодні операції малювання. Стандартна роздільна здатність нових зображень — 96 DPI. (більше)

rotate (float $angle, int $backgroundColor)Image

Повертає зображення за допомогою заданого $angle у градусах. Центр обертання — це центр зображення, і повернуте зображення може мати інші розміри, ніж оригінальне зображення. (більше)

Потребує наявності Bundled GD extension, тому може працювати не скрізь.

save (string $file, ?int $quality=null, ?int $type=null)void

Зберігає зображення у файл.

Якість стиснення знаходиться в діапазоні 0..100 для JPEG (за замовчуванням 85), WEBP (за замовчуванням 80) та AVIF (за замовчуванням 30) і 0..9 для PNG (за замовчуванням 9). Якщо тип не зрозумілий з розширення файлу, ви можете вказати його за допомогою однієї з констант ImageType.

saveAlpha (bool $saveflag)void

Встановлює прапорець, чи зберігати повну інформацію про альфа-канал при збереженні зображень PNG (на відміну від одноколірної прозорості).

Альфа-змішування має бути вимкнено (alphaBlending(false)), щоб альфа-канал зберігся на першому місці. (більше)

scale (int $newWidth, int $newHeight=-1, int $mode=IMG_BILINEAR_FIXED)Image

Масштабує зображення за допомогою заданого алгоритму інтерполяції. (більше)

send (int $type=ImageType::JPEG, ?int $quality=null)void

Виводить зображення в браузер.

Якість стиснення знаходиться в діапазоні 0..100 для JPEG (за замовчуванням 85), WEBP (за замовчуванням 80) та AVIF (за замовчуванням 30) і 0..9 для PNG (за замовчуванням 9).

setBrush (Image $brush)void

Встановлює зображення пензля, яке буде використовуватися у всіх функціях малювання ліній (наприклад, line() та polygon()) при малюванні спеціальними кольорами IMG_COLOR_BRUSHED або IMG_COLOR_STYLEDBRUSHED. (більше)

setClip (int $x1, int $y1, int $x2, int $y2)void

Встановлює поточну область обрізки, тобто область, за межами якої не будуть намальовані жодні пікселі. (більше)

setInterpolation (int $method=IMG_BILINEAR_FIXED)void

Встановлює метод інтерполяції, який впливає на методи rotate() та affine(). (більше)

setPixel (int $x, int $y, ImageColor $color)void

Малює піксель на заданій координаті. (більше)

setStyle (array $style)void

Встановлює стиль, який мають використовувати всі функції малювання ліній (наприклад, line() та polygon()) при малюванні спеціальним кольором IMG_COLOR_STYLED або ліній зображень з кольором IMG_COLOR_STYLEDBRUSHED. (більше)

setThickness (int $thickness)void

Встановлює товщину ліній при малюванні прямокутників, багатокутників, дуг тощо на $thickness пікселів. (більше)

setTile (Image $tile)void

Встановлює зображення плитки, яке буде використовуватися у всіх функціях заповнення областей (наприклад, fill() та filledPolygon()), коли заповнюється спеціальним кольором IMG_COLOR_TILED.

Плитка — це зображення, яке використовується для заповнення області повторюваним візерунком. Будь-яке зображення можна використовувати як плитку, а встановивши прозорий індекс кольору зображення плитки за допомогою colorTransparent(), можна створити плитку, де будуть просвічувати певні частини базової області. (більше)

sharpen(): Image

Підвищує різкість зображення.

Потребує наявності Bundled GD extension, тому може працювати не скрізь.

toString (int $type=ImageType::JPEG, ?int $quality=null)string

Зберігає зображення в рядок.

Якість стиснення знаходиться в діапазоні 0..100 для JPEG (за замовчуванням 85), WEBP (за замовчуванням 80) та AVIF (за замовчуванням 30) і 0..9 для PNG (за замовчуванням 9).

trueColorToPalette (bool $dither, int $ncolors)void

Перетворює зображення truecolor на палітрове. (більше)

ttfText (float $size, float $angle, int $x, int $y, ImageColor $color, string $fontFile, string $text, array $options=[])array

Виводить заданий текст на зображення. (більше)

версія: 4.0