PHP

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

Библиотека GD дает возможность работать с изображениями в PHP.
Подробнее о функциях GD на 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;
}
2

Изменение размера изображения (resize)

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

// Размеры новой фотки.
$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;
$h = 0;
$w = 200;
$h = 100;
$w = 100;
$h = 200;
3

Обрезать изображение (crop)

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

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

5

Зеркальное отражение

imageflip($img, IMG_FLIP_HORIZONTAL);

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

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

Наложение водяного знака (watermark)

Для защиты на картинки наносят копирайт, например, данный скрип накладывает картинку watermark.png на основное изображение:

$watermark = __DIR__ . '/watermark.png';

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

$info = getimagesize($watermark);
switch ($info[2]) { 
    case 1: 
        $tmp = imageCreateFromGif($watermark);
        break;                    
    case 2: 
        $tmp = imageCreateFromJpeg($watermark);
        break;
    case 3: 
        $tmp = imageCreateFromPng($watermark); 
        break;
}

if (strpos($x, '%') !== false) {
    $x = intval($x);
    $x = ceil(($width * $x / 100) - ($info[0] / 100 * $x));
}
if (strpos($y, '%') !== false) {
    $y = intval($y);
    $y = ceil(($height * $y / 100) - ($info[1] / 100 * $y));
}

imagecopy($img, $tmp, $x, $y, 0, 0, $info[0], $info[1]); 
imagedestroy($tmp);

Результат:

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

Добавление фона

Актуально для 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;
Фон Результат
8

Фильтры

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
9

Сохранение

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

До вызова функции 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();
22 января 2018
В последнее время письма отправляемые с хостингов через функции mail() и mb_send_mail() часто попадают или совсем не...
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и...
В продолжении темы работы с массивами поговорим о типичной задаче – их сортировке. Для ее выполнения в PHP существует...