Библиотека GD дает возможность работать с изображениями в PHP. Подробнее о функциях на php.net.
Далее представлены примеры как изменить размер, вырезать часть изображения и т.д. Все примеры универсальные и работают с разными типами файлов без изменений кода, у PNG файлов сохраняется прозрачность.
Итак, есть исходное изображение PNG 400x400px:

С помощью функции getimagesize() получим ширину, высоту и тип, далее откроем его функциями в зависимости от типа:
$filename = __DIR__ . '/donut.png';
$info = getimagesize($filename);
$width = $info[0];
$height = $info[1];
$type = $info[2];
switch ($type) {
case 1:
$img = imageCreateFromGif($filename);
imageSaveAlpha($img, true);
break;
case 2:
$img = imageCreateFromJpeg($filename);
break;
case 3:
$img = imageCreateFromPng($filename);
imageSaveAlpha($img, true);
break;
}
Приведенный код уменьшает или увеличивает изображение не искажая его пропорции.
// Размеры новой фотки.
$w = 200;
$h = 0;
if (empty($w)) {
$w = ceil($h / ($height / $width));
}
if (empty($h)) {
$h = ceil($w / ($width / $height));
}
$tmp = imageCreateTrueColor($w, $h);
if ($type == 1 || $type == 3) {
imagealphablending($tmp, true);
imageSaveAlpha($tmp, true);
$transparent = imagecolorallocatealpha($tmp, 0, 0, 0, 127);
imagefill($tmp, 0, 0, $transparent);
imagecolortransparent($tmp, $transparent);
}
$tw = ceil($h / ($height / $width));
$th = ceil($w / ($width / $height));
if ($tw < $w) {
imageCopyResampled($tmp, $img, ceil(($w - $tw) / 2), 0, 0, 0, $tw, $h, $width, $height);
} else {
imageCopyResampled($tmp, $img, 0, ceil(($h - $th) / 2), 0, 0, $w, $th, $width, $height);
}
$img = $tmp;
Результат
$w = 200;![]() |
$w = 200;![]() |
$w = 100;![]() |
Пример вырезает из исходного изображения часть размером $w на $h.
$x и $y задают начальные координаты в пикселях или процентах.
$w = 200;
$h = 200;
$x = '100%';
$y = '100%';
if (strpos($x, '%') !== false) {
$x = intval($x);
$x = ceil(($width * $x / 100) - ($w / 100 * $x));
}
if (strpos($y, '%') !== false) {
$y = intval($y);
$y = ceil(($height * $y / 100) - ($h / 100 * $y));
}
$tmp = imageCreateTrueColor($w, $h);
if ($type == 1 || $type == 3) {
imagealphablending($tmp, true);
imageSaveAlpha($tmp, true);
$transparent = imagecolorallocatealpha($tmp, 0, 0, 0, 127);
imagefill($tmp, 0, 0, $transparent);
imagecolortransparent($tmp, $transparent);
}
imageCopyResampled($tmp, $img, 0, 0, $x, $y, $width, $height, $width, $height);
$img = $tmp;
Результат
$x = 0;![]() |
$x = '50%';![]() |
$x = '100%';![]() |
Функция imagerotate() поворачивает изображение на заданный угол против часовой стрелки, отрицательный угол меняет направление поворота.
// Поворот против часовой стрелки на 45°.
$transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
$img = imagerotate($img, 45, $transparent);
// Поворот по часовой стрелки на 90°
$transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
$img = imagerotate($img, -90, $transparent);
Поворот на не ровный угол увеличит ширину и высоту фото:

imageflip($img, IMG_FLIP_HORIZONTAL);
Imageflip() зеркалит изображение, могут быть следующие параметры:
IMG_FLIP_HORIZONTAL |
По горизонтали |
IMG_FLIP_VERTICAL |
По вертикали |
IMG_FLIP_BOTH |
По горизонтали и вертикали |
Актуально для PNG с прозрачностью. Скрипт вставит на задний фон картинку с положением $x и $y. Размер основного изображения не изменится.
$file = __DIR__ . '/donut_bg.jpg';
// Положение фона.
$x = '50%';
$y = '50%';
$info = getimagesize($file);
switch ($info[2]) {
case 1:
$bg = imageCreateFromGif($file);
break;
case 2:
$bg = imageCreateFromJpeg($file);
break;
case 3:
$bg = imageCreateFromPng($file);
break;
}
if (strpos($x, '%') !== false) {
$x = intval($x);
$x = ceil(($info[0] * $x / 100) - ($width / 100 * $x));
}
if (strpos($y, '%') !== false) {
$y = intval($y);
$y = ceil(($info[1] * $y / 100) - ($height / 100 * $y));
}
$tmp = imageCreateTrueColor($width, $height);
imagecopy($tmp, $bg, 0, 0, $x, $y, $width, $height);
imagedestroy($bg);
imagecopy($tmp, $img, 0, 0, 0, 0, $width, $height);
$img = $tmp;
Фон![]() |
Результат![]() |
imagefilter($img, $filtertype, $arg1, $arg2);
Функция imagefilter() применяет фильтр к изображению.
В параметре $filtertype указывается константа применяемого фильтра, а в следующих его настройки.
IMG_FILTER_NEGATE
Инвертирует цвета изображения.
imagefilter($img, IMG_FILTER_NEGATE);

IMG_FILTER_GRAYSCALE
Преобразует цвета изображения в градации серого.
imagefilter($img, IMG_FILTER_GRAYSCALE);

IMG_FILTER_COLORIZE
Преобразует цвета изображения в градации заданного цвета в формате RGB.
// Красный
imagefilter($img, IMG_FILTER_COLORIZE, 0, 240, 120);
// Синий
imagefilter($img, IMG_FILTER_COLORIZE, 150, 240, 120);
// Зеленый
imagefilter($img, IMG_FILTER_COLORIZE, 90, 240, 90);
0, 240, 120![]() |
150, 240, 120![]() |
90, 240, 90![]() |
IMG_FILTER_BRIGHTNESS
Изменяет яркость изображения, диапазон от -255 до 255.
imagefilter($img, IMG_FILTER_BRIGHTNESS, 127);
-200![]() |
-100![]() |
100![]() |
200![]() |
IMG_FILTER_CONTRAST
Изменяет контрастность изображения. Уровень может быть от -100 до 100.
imagefilter($img, IMG_FILTER_CONTRAST, 100);
-100![]() |
-50![]() |
50![]() |
100![]() |
IMG_FILTER_EDGEDETECT
Использует определение границ для их подсветки.
imagefilter($img, IMG_FILTER_EDGEDETECT);

IMG_FILTER_EMBOSS
Добавляет рельеф.
imagefilter($img, IMG_FILTER_EMBOSS);

IMG_FILTER_GAUSSIAN_BLUR
Размывает изображение по методу Гаусса.
imagefilter($img, IMG_FILTER_GAUSSIAN_BLUR);

IMG_FILTER_SELECTIVE_BLUR
Как и IMG_FILTER_GAUSSIAN_BLUR размывает изображение.
imagefilter($img, IMG_FILTER_SELECTIVE_BLUR);
IMG_FILTER_MEAN_REMOVAL
Делает эффект «эскиза».
imagefilter($img, IMG_FILTER_MEAN_REMOVAL);

IMG_FILTER_SMOOTH
Делает границы более плавными, а изображение менее четким. Диапазон значений не ограничен, но наиболее заметные изменения происходят от 0 до -8.
imagefilter($img, IMG_FILTER_SMOOTH, -2);
0![]() |
-2![]() |
-4![]() |
-6![]() |
IMG_FILTER_PIXELATE
Применяет эффект пикселирования.
arg1 – задает размера блока в пикселях.
arg2 – включает усовершенствованный эффект пикселирования.
imagefilter($img, IMG_FILTER_PIXELATE, 2, true);
2 |
3 |
4 |
5 |
Вывод изображения в браузер
До вызова функции header() скрипт ничего не должен выводить (echo, ?>...<?php), иначе картинка будет битой.
switch ($type) {
case 1:
header('Content-Type: image/gif');
imageGif($img);
break;
case 2:
header('Content-Type: image/jpeg');
imageJpeg($img, null, 100);
break;
case 3:
header('Content-Type: image/x-png');
imagePng($img);
break;
}
imagedestroy($img);
exit();
Чтобы браузер отдал фото на скачивание, в начало кода нужно добавить заголовок:
header('Content-Disposition: Attachment;filename=' . basename($src));
Сохранение изображения в файл на сервере
switch ($type) {
case 1:
imageGif($img, $src);
break;
case 2:
imageJpeg($img, $src, 100);
break;
case 3:
imagePng($img, $src);
break;
}
imagedestroy($img);
Вывод в браузер и сохранение в файл
switch ($type) {
case 1:
header('Content-Type: image/gif');
imageGif($img, $src);
break;
case 2:
header('Content-Type: image/jpeg');
imageJpeg($img, $src, 100);
break;
case 3:
header('Content-Type: image/x-png');
imagePng($img, $src);
break;
}
imagedestroy($img);
readfile($src);
exit();




























