Библиотека 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_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()
применяет фильтр к изображению.
В параметре $filtertype
указывается константа применяемого фильтра, а в следующих его настройки.
IMG_FILTER_NEGATE
Инвертирует цвета изображения.
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.
-200 |
-100 |
100 |
200 |
IMG_FILTER_CONTRAST
Изменяет контрастность изображения. Уровень может быть от -100 до 100.
-100 |
-50 |
50 |
100 |
IMG_FILTER_EDGEDETECT
Использует определение границ для их подсветки.
IMG_FILTER_EMBOSS
Добавляет рельеф.
IMG_FILTER_GAUSSIAN_BLUR
Размывает изображение по методу Гаусса.
IMG_FILTER_SELECTIVE_BLUR
Как и IMG_FILTER_GAUSSIAN_BLUR
размывает изображение.
IMG_FILTER_MEAN_REMOVAL
Делает эффект «эскиза».
IMG_FILTER_SMOOTH
Делает границы более плавными, а изображение менее четким. Диапазон значений не ограничен, но наиболее заметные изменения происходят от 0 до -8.
0 |
-2 |
-4 |
-6 |
IMG_FILTER_PIXELATE
Применяет эффект пикселирования.
arg1
– задает размера блока в пикселях.
arg2
– включает усовершенствованный эффект пикселирования.
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();
Чтобы браузер отдал фото на скачивание, в начало кода нужно добавить заголовок:
Сохранение изображения в файл на сервере
switch ($type) {
case 1:
imageGif($img, $src);
break;
case 2:
imageJpeg($img, $src, 100);
break;
case 3:
imagePng($img, $src);
break;
}
imagedestroy($img);