Масштабирование изображений в PHP
В предыдущей статье я рассказал, как обрезать изображение на PHP. В этой же статье я расскажу, как масштабировать изображение на PHP, то есть либо сжать, либо растянуть.
Давайте сразу приведу код функции масштабирования изображения на PHP:
<?php
/*
$w_o и h_o — ширина и высота выходного изображения
*/
function resize($image, $w_o = false, $h_o = false) <
if (($w_o < 0) || ($h_o < 0)) <
echo «Некорректные входные параметры»;
return false;
>
list($w_i, $h_i, $type) = getimagesize($image); // Получаем размеры и тип изображения (число)
$types = array(«», «gif», «jpeg», «png»); // Массив с типами изображений
$ext = $types[$type]; // Зная «числовой» тип изображения, узнаём название типа
if ($ext) <
$func = ‘imagecreatefrom’.$ext; // Получаем название функции, соответствующую типу, для создания изображения
$img_i = $func($image); // Создаём дескриптор для работы с исходным изображением
> else <
echo ‘Некорректное изображение’; // Выводим ошибку, если формат изображения недопустимый
return false;
>
/* Если указать только 1 параметр, то второй подстроится пропорционально */
if (!$h_o) $h_o = $w_o / ($w_i / $h_i);
if (!$w_o) $w_o = $h_o / ($h_i / $w_i);
$img_o = imagecreatetruecolor($w_o, $h_o); // Создаём дескриптор для выходного изображения
imagecopyresampled($img_o, $img_i, 0, 0, 0, 0, $w_o, $h_o, $w_i, $h_i); // Переносим изображение из исходного в выходное, масштабируя его
$func = ‘image’.$ext; // Получаем функция для сохранения результата
return $func($img_o, $image); // Сохраняем изображение в тот же файл, что и исходное, возвращая результат этой операции
>
/* Вызываем функцию с целью уменьшить изображение до ширины в 100 пикселей, а высоту уменьшив пропорционально, чтобы не искажать изображение */
resize(«image.jpg», 100); // Вызываем функцию
?>
Вот такая полезная и простая функция легко позволяет сжимать и растягивать изображения на PHP, при этом при необходимости и сохранять пропорции.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Обработка изображений в PHP
Библиотека GD дает возможность работать с изображениями в PHP. Подробнее о функциях на php.net.
Далее представлены примеры как изменить размер, вырезать часть изображения и т.д. Все примеры универсальные и работают с разными типами файлов без изменений кода, у PNG файлов сохраняется прозрачность.
Открытие изображения
Итак, есть исходное изображение PNG 400x400px:
С помощью функции getimagesize() получим ширину, высоту и тип, далее откроем его функциями в зависимости от типа:
Изменение размера изображения (resize)
Приведенный код уменьшает или увеличивает изображение не искажая его пропорции.
Результат
$w = 200; $h = 0; /> |
$w = 200; $h = 100; |
$w = 100; $h = 200; /> |
Обрезать изображение (crop)
Пример вырезает из исходного изображения часть размером $w на $h .
$x и $y задают начальные координаты в пикселях или процентах.
Результат
$x = 0; $y = 0; |
$x = '50%'; $y = '0%'; |
$x = '100%'; $y = '0%'; |
Поворот изображения
Функция imagerotate() поворачивает изображение на заданный угол против часовой стрелки, отрицательный угол меняет направление поворота.
Поворот на не ровный угол увеличит ширину и высоту фото:
Зеркальное отражение
Imageflip() зеркалит изображение, могут быть следующие параметры:
IMG_FLIP_HORIZONTAL | По горизонтали |
IMG_FLIP_VERTICAL | По вертикали |
IMG_FLIP_BOTH | По горизонтали и вертикали |
Добавление фона
Актуально для PNG с прозрачностью. Скрипт вставит на задний фон картинку с положением $x и $y . Размер основного изображения не изменится.
Фон |
Результат |
Фильтры
Функция imagefilter() применяет фильтр к изображению.
В параметре $filtertype указывается константа применяемого фильтра, а в следующих его настройки.
Изменение размера и манипулирование изображениями в PHP (с примерами).
В предыдущем уроке мы обсудили основные манипуляции с изображениями с помощью библиотеки PHP GD . В этом уроке я дал краткое введение в библиотеку и показал вам, как загружать изображения из файла или создавать их с нуля в PHP. После этого мы научились кадрировать, вращать, масштабировать и переворачивать изображение с помощью GD. Я применил функцию imagefilter() , чтобы применить различные фильтры к ресурсам изображений, загруженным в сценарий. Я также упомянул о некоторых полезных функциях в GD, таких как imagesx() и imagesy() , чтобы получить ширину и высоту загруженного изображения.
К концу моего последнего учебника GD вы узнали, как использовать библиотеку для автоматизации основных задач, таких как изменение размера всех изображений в каталоге или применение на них фильтров, таких как оттенки серого, прежде чем сохранять окончательный результат. Если вы никогда раньше не использовали библиотеку PHP GD, я бы посоветовал вам перейти к этой вводной статье GD , прежде чем читать эту.
В этом уроке мы узнаем о многих других полезных функциях в GD и о том, как их можно использовать для автоматизации наших задач манипулирования изображениями.
Манипулирование изображениями с использованием матрицы свертки
За исключением пикселей на краях, каждый пиксель в изображении окружен восемью другими пикселями. Эффекты, такие как размытие или обнаружение края, вычисляются для каждого пикселя в зависимости от значения этого пикселя и значений окружающих пикселей. Например, при обнаружении краев резкое изменение цвета означает, что мы достигли края какого-либо объекта на изображении. Например, внезапное изменение от белого до коричневого на изображении ниже означает границу чашки и стола.
Легкий способ указать такой фильтр — это так называемая «матрица свертки». GD предоставляет функцию imageconvolution($image, $matrix, $div, $offset) для применения матрицы свертки 3×3 к изображению ресурса $image .
Параметр $matrix представляет собой массив из трех массивов, каждый из которых содержит три значения с плавающей точкой — то есть это матрица 3х3. Первый элемент первого массива умножается на значение цвета верхнего левого пикселя. Аналогично, второй элемент первого массива умножается на значение цвета пикселя непосредственно поверх центрального пикселя. Конечный цвет пикселя получается путем добавления результата всех этих умножений, а затем деления его на $div для нормализации. Обычно нормализация сохраняет окончательное значение цвета ниже 255.
Как мы видели, параметр $div используется как делитель для результата свертки для нормализации его значения. С другой стороны, параметр $offset используется для указания значения смещения для всех цветов. Вы увидите, как это влияет на конечный результат в приведенных ниже примерах.
Примеры свертки
Вот список некоторых различных матриц свертки, которые мы применили к изображению чашки на столе.
Размытие Blur
Размытие Blur работает, просто усредняя каждый пиксель со своими соседями. Мы устанавливаем значение делителя на 9, потому что сумма всех элементов в трех массивах равна 9.
Резкость Sharpen
Sharpen работает, преувеличивая различия между каждым пикселем и его соседями. Это делает края немного яснее. В случае резкости делитель равен 1, так как сумма всех элементов в трех массивах равна 1.
Тиснение Emboss
Матрица тиснения аналогична матрице резкости, за исключением того, что значения отрицательны в верхнем левом и положительном в нижнем правом — вот что создает эффект тиснения. Сумма всех элементов в случае матрицы свертки тиснения равна 1, поэтому нам не нужно беспокоиться о нормализации или смещении цвета.
Обнаружение краев
Обнаружение кромок похоже на резкость, но эффект еще сильнее. Кроме того, исходное значение изображения дается не больше, чем у соседей — это значит, что мы заботимся только о краях, а не о оригинальных сплошных цветных областях.
При обнаружении края сумма всех элементов массива равна 0. Это означает, что изображение, которое мы получим, будет в основном черным, если не произойдет резкого изменения цвета, что обычно происходит на краях объектов. В основном черное изображение может быть повернуто на белый, установив параметр смещения на 255.
На следующем рисунке показан результат всех этих сверточных матриц.
Функции копирования изображений
PHP GD имеет множество функций для копирования части изображения, а затем изменения размера или слияния. При использовании этих функций важно помнить, что PHP рассматривает верхний левый угол ресурса изображения как его источник. Положительное значение x приведет вас вправо от изображения, а положительное значение y приведет вас к дальнейшему снижению.
Простейшей из этих функций является imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h) . Она скопирует исходное изображение на изображение назначения. Параметры $dst_x и $dst_y определяют верхний левый угол, в который будет вставлено скопированное изображение. Параметры $src_x , $src_y , $src_w и $src_h определяют прямоугольную часть исходного изображения, которая будет скопирована в пункт назначения.
Вы можете использовать эту функцию для обрезки изображений, создавая изображение с нуля с помощью imagecreatetruecolor() и копируя в него прямоугольник обрезки исходного изображения. Вы также можете использовать его для добавления водяных знаков на изображениях, но вы должны помнить, что с помощью этого метода размер водяного знака не может быть изменен в зависимости от размера наших изображений.
Одним из решений этой проблемы является использование функций imagecopyresized($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) . Он принимает все параметры imagecopy() и два дополнительных параметра для определения размера области назначения, в которой будет скопировано исходное изображение.
Функция imagecopyresized() не идеальна, так как она масштабирует изображение вверх и вниз не очень хорошо. Однако, вы можете получить более качественное изменение размера с помощью функции imagecopyresampled() , которая принимает все те же параметры.
Копирование с прозрачностью
Есть еще две функции, связанные с копированием изображений, которые вы найдете очень полезными: imagecopymerge() и imagecopymergegray() .
Функция imagecopymerge($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) похожа на imagecopy() , где дополнительный параметр $pct определяет прозрачность скопированного образ. Значение 0 означает отсутствие прозрачности, а значение 100 означает полную прозрачность. Это будет очень полезно, если вы не хотите полностью скрывать содержимое основного изображения за вашим водяным знаком.
С другой стороны, функция imagecopymergegray() использует последний параметр для преобразования исходного изображения в оттенки серого. Если он установлен в 0, исходное изображение потеряет весь его цвет. Если установлено значение 100, исходное изображение останется неизменным.
Пример копирования изображения
Следующий пример использует функцию imagecopy() , чтобы превратить правую половину изображения в негатив. Мы уже обсуждали другие функции, такие как imagefilter() и imagescale() , используемые в этом фрагменте кода в предыдущем уроке .
Здесь мы создаем две копии исходного изображения, каждая из которых была уменьшена до ширины 800 пикселей. После этого мы используем функцию imagefilter() для создания негатива ресурса изображения $img_php_inv . Правая половина этого негатива затем копируется на исходное изображение с помощью функции imagecopy() .
Это было очень простое использование функции imagecopy() . Вы можете увидеть результаты ниже. Вы также можете разделить изображение на более мелкие секции или полосы, чтобы создавать более интересные эффекты изображения. Мы будем использовать функцию imagecopymergegray() в фрагменте кода ниже, чтобы создать намного больше полос в исходном изображении рыбы.
Вышеприведенный пример кода использует аналогичную стратегию для предыдущего примера, но на этот раз мы разделили изображение на более мелкие полосы, которые переводятся в оттенки серого или сохраняются неизменными на основе значения переменной $i . После завершения всех операций слияния копий мы применяем два фильтра на изображении, чтобы выделить полосы.
На следующем рисунке показан конечный результат этих двух функций в сочетании с различными фильтрами изображений.
Добавление водяных знаков или другой информации в изображениях
Некоторые организации добавляют водяные знаки к своим изображениям, чтобы было ясно, что они имеют изображение. Это также увеличивает узнаваемость бренда и отговаривает других людей от грубого копирования изображений. Благодаря PHP GD, водяные знаки — это простая задача.
В приведенном выше фрагменте кода мы создали два разных ресурса изображения, используя imagecreatefromjpeg() для основного изображения и imagecreatefrompng() для водяного знака, соответственно. Мы определяем ширину и высоту основного изображения с помощью функций imagesx() и imagesy() .
Не все изображения, которые вы хотите использовать для водяных знаков, будут иметь одинаковые размеры. Если вы не измените размер водяного знака на основе размеров основного изображения, это может показаться странным. Например, водяной знак 200px может выглядеть хорошо на 1000px-изображении, но он будет слишком большим для изображения шириной 600 пикселей, и он может выглядеть слишком маленьким на изображении шириной 2400 пикселей.
Поэтому мы используем функцию imagescale() , чтобы сохранить водяной знак на одной пятой от первоначальной ширины изображения. Затем мы используем функцию imagecopy() , чтобы поместить водяной знак в нужное место. Вот окончательный результат приведенного выше фрагмента кода.
Помимо водяных знаков, вы также можете добавить другую информацию, такую как место, где была сделана фотография, или время, когда была сделана фотография.
Заключительные мысли
После изучения основ манипуляции с изображениями в нашем предыдущем учебнике мы узнали о нескольких других полезных функциях в библиотеке GD. В первой части учебника обсуждалось, как мы можем манипулировать изображениями на PHP с использованием матрицы свертки. Я также показал некоторые примеры операции матрицы свертки, которые помогут вам понять, как PHP достигает значений цвета разных пикселей.
Во второй части учебника объясняется, как копировать и/или изменять размер части изображения, чтобы вставить его в другое место. Это удобно, когда мы хотим добавить что-то к изображению, например, к водяному знаку или к отметке времени.
Попробуйте использовать все эти функции для создания интересных эффектов изображения!
Изменить размер изображения в PHP
В этой обучающей статье мы обсудим изменение размера изображения в PHP.
Загрузите изображение перед изменением размера
Прежде чем изменять размер изображения, мы должны сначала загрузить его как ресурс изображения в скрипте. Это не то же самое, что использование таких функций, как file_get_contents() для получения содержимого файла изображения. Чтобы загрузить файл, нам нужно использовать такие функции, как imagecreatefromjpeg() , imagecreatefrompng() и imagecreatefromgif() , среди других. В зависимости от типа изображения, размер которого мы будем изменять, мы будем соответственно использовать другую функцию.
getimagesize () в PHP
После загрузки изображения мы используем getimagesize() для вычисления ширины, высоты и типа входного изображения. Эта функция возвращает список элементов, где ширина и высота изображения хранятся с индексами 0 и 1 соответственно, а константы IMAGETYPE_XXX хранятся с индексом 2. Мы будем использовать значение этой возвращенной константы, чтобы выяснить, что тип изображения и функции.