Обработка изображений в PHP

Библиотека GD дает возможность работать с изображениями в PHP. Подробнее о функциях на php.net.

Далее представлены примеры как изменить размер, вырезать часть изображения и т.д. Все примеры универсальные и работают с разными типами файлов без изменений кода, у PNG файлов сохраняется прозрачность.

1

Итак, есть исходное изображение 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;
}
PHP
2

Приведенный код уменьшает или увеличивает изображение не искажая его пропорции.

// Размеры новой фотки.
$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;
PHP

Результат

$w = 200;
$h = 0;

$w = 200;
$h = 100;

$w = 100;
$h = 200;

3

Пример вырезает из исходного изображения часть размером $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;
PHP

Результат

$x = 0;
$y = 0;

$x = '50%';
$y = '0%';

$x = '100%';
$y = '0%';

4

Функция 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);
PHP

Поворот на не ровный угол увеличит ширину и высоту фото:

5
imageflip($img, IMG_FLIP_HORIZONTAL);
PHP

Imageflip() зеркалит изображение, могут быть следующие параметры:

IMG_FLIP_HORIZONTAL По горизонтали
IMG_FLIP_VERTICAL По вертикали
IMG_FLIP_BOTH По горизонтали и вертикали
6

Актуально для 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;
PHP
Фон
Результат
7
imagefilter($img, $filtertype, $arg1, $arg2);
PHP

Функция imagefilter() применяет фильтр к изображению.
В параметре $filtertype указывается константа применяемого фильтра, а в следующих его настройки.

IMG_FILTER_NEGATE

Инвертирует цвета изображения.

imagefilter($img, IMG_FILTER_NEGATE);
PHP

IMG_FILTER_GRAYSCALE

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

imagefilter($img, IMG_FILTER_GRAYSCALE);
PHP

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);
PHP
0, 240, 120
150, 240, 120
90, 240, 90

IMG_FILTER_BRIGHTNESS

Изменяет яркость изображения, диапазон от -255 до 255.

imagefilter($img, IMG_FILTER_BRIGHTNESS, 127);
PHP
-200
-100
100
200

IMG_FILTER_CONTRAST

Изменяет контрастность изображения. Уровень может быть от -100 до 100.

imagefilter($img, IMG_FILTER_CONTRAST, 100);
PHP
-100
-50
50
100

IMG_FILTER_EDGEDETECT

Использует определение границ для их подсветки.

imagefilter($img, IMG_FILTER_EDGEDETECT);
PHP

IMG_FILTER_EMBOSS

Добавляет рельеф.

imagefilter($img, IMG_FILTER_EMBOSS);
PHP

IMG_FILTER_GAUSSIAN_BLUR

Размывает изображение по методу Гаусса.

imagefilter($img, IMG_FILTER_GAUSSIAN_BLUR);
PHP

IMG_FILTER_SELECTIVE_BLUR

Как и IMG_FILTER_GAUSSIAN_BLUR размывает изображение.

imagefilter($img, IMG_FILTER_SELECTIVE_BLUR);
PHP

IMG_FILTER_MEAN_REMOVAL

Делает эффект «эскиза».

imagefilter($img, IMG_FILTER_MEAN_REMOVAL);
PHP

IMG_FILTER_SMOOTH

Делает границы более плавными, а изображение менее четким. Диапазон значений не ограничен, но наиболее заметные изменения происходят от 0 до -8.

imagefilter($img, IMG_FILTER_SMOOTH, -2);
PHP
0
-2
-4
-6

IMG_FILTER_PIXELATE

Применяет эффект пикселирования.

arg1 – задает размера блока в пикселях.
arg2 – включает усовершенствованный эффект пикселирования.

imagefilter($img, IMG_FILTER_PIXELATE, 2, true);
PHP
2
3
4
5
8

Вывод изображения в браузер

До вызова функции 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();
PHP

Чтобы браузер отдал фото на скачивание, в начало кода нужно добавить заголовок:

header('Content-Disposition: Attachment;filename=' . basename($src)); 
PHP

Сохранение изображения в файл на сервере

switch ($type) {
	case 1:
		imageGif($img, $src);
		break;			
	case 2:
		imageJpeg($img, $src, 100);
		break;			
	case 3:
		imagePng($img, $src);
		break;
}

imagedestroy($img);
PHP

Вывод в браузер и сохранение в файл

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();
PHP
22.01.2018, обновлено 10.03.2024
58186
Предыдущая запись PHP паттерн Registry
Следующая запись Изображения WebP в GD PHP

Комментарии 1

Иван Орлов Иван Орлов
3 января 2024 в 12:11
Похоже что-то с сохранением намудрили. У меня изображение не сохраняется на сервер. Вместо этого, когда запускаю скрипт в браузере, скачивается сам скрипт php.

, чтобы добавить комментарий.

Другие публикации

Генерация превьюшек изображений на лету
В движках интернет магазинов, часто при добавлении товара и загрузке его фото, на сервере сразу генерируются превью...
6377
+4
Генерация QR-кода в PHP
Вопрос генерации QR-кодов в PHP достаточно освещён, есть много библиотек, одной из них является «PHP QR Code» – быстрый и легкий класс, рассмотрим его применение совместно с графической библиотекой...
66532
+18
Мануал по созданию и форматированию excel файлов в PHPExcel
К сожалению разработчики прекратили поддержку и разработку проекта, но PHPExcel все равно остается популярной...
129071
+36
Определение основного цвета изображения в PHP
Определение доминирующего цвета фотографии дает возможность реализовать поиск изображений по цвету или сделать цветные...
9475
+3
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
65862
+33
Как нарисовать точку в PHP GD
Примеры, как нарисовать точку в библиотеке PHP GD.
2056
+1