Примеры php imagemagick php
В PHP очень легко управлять объектом Imagick используя объектно-ориентированный интерфейс. Вот небольшой пример, как сделать миниатюру:
Пример #1 Создание миниатюры в Imagick
header ( ‘Content-type: image/jpeg’ );
$image = new Imagick ( ‘image.jpg’ );
// Если в качестве ширины или высоты передан 0,
// то сохраняется соотношение сторон
$image -> thumbnailImage ( 100 , 0 );
С использованием SPL и других объектно-ориентированных функций поддерживаемых в Imagick, можно очень легко изменить размеры всех файлов в директории (полезно для пакетного изменения больших изображений с цифровой камеры для просмотра в Web). Здесь мы используем изменение размера, используя определённые мета-данные:
Пример #2 Создание миниатюр для всех JPG файлов в директории
$images = new Imagick ( glob ( ‘images/*.JPG’ ));
// Передаём 0 в thumbnailImage для сохранения соотношения сторон
$image -> thumbnailImage ( 1024 , 0 );
Этот пример создаёт отражение изображения. Отражение создаётся зеркальным отображением и наложением градиента на нём. Затем оригинальное изображение и его отражение накладываются на холст.
Пример #3 Создание отражения
/* Чтение изображения */
$im = new Imagick ( «test.png» );
?php
/* Миниатюра изображения */
$im -> thumbnailImage ( 200 , null );
/* Создание рамки для изображения */
$im -> borderImage (new ImagickPixel ( «white» ), 5 , 5 );
/* Клонируем изображение и зеркально поворачиваем его */
$reflection = $im -> clone ();
$reflection -> flipImage ();
/* Создаём градиент. Это будет наложением для отражения */
$gradient = new Imagick ();
/* Градиент должен быть достаточно большой для изображения и его рамки */
$gradient -> newPseudoImage ( $reflection -> getImageWidth () + 10 , $reflection -> getImageHeight () + 10 , «gradient:transparent-black» );
/* Наложение градиента на отражение */
$reflection -> compositeImage ( $gradient , imagick :: COMPOSITE_OVER , 0 , 0 );
/* Добавляем прозрачность. Требуется ImageMagick 6.2.9 или выше */
$reflection -> setImageOpacity ( 0.3 );
/* Создаём пустой холст */
$canvas = new Imagick ();
/* Холст должен быть достаточно большой, чтобы вместить оба изображения */
$width = $im -> getImageWidth () + 40 ;
$height = ( $im -> getImageHeight () * 2 ) + 30 ;
$canvas -> newImage ( $width , $height , new ImagickPixel ( «black» ));
$canvas -> setImageFormat ( «png» );
/* Наложение оригинального изображения и отражения на холст */
$canvas -> compositeImage ( $im , imagick :: COMPOSITE_OVER , 20 , 10 );
$canvas -> compositeImage ( $reflection , imagick :: COMPOSITE_OVER , 20 , $im -> getImageHeight () + 10 );
/* Вывод изображения */
header ( «Content-Type: image/png» );
echo $canvas ;
?>
Результатом выполнения данного примера будет что-то подобное:
Этот пример иллюстрирует как использовать заливку во время рисования.
Пример #4 Заливка текста градиентом
/* Создание нового объекта imagick */
$im = new Imagick ();
/* Создание нового изображения. Будет использоваться как шаблон заливки */
$im -> newPseudoImage ( 50 , 50 , «gradient:red-black» );
/* Создаём объект imagickdraw */
$draw = new ImagickDraw ();
/* Запускаем новый шаблон с названием «gradient» */
$draw -> pushPattern ( ‘gradient’ , 0 , 0 , 50 , 50 );
/* Смешиваем градиент с шаблоном */
$draw -> composite ( Imagick :: COMPOSITE_OVER , 0 , 0 , 50 , 50 , $im );
/* Закрываем шаблон */
$draw -> popPattern ();
/* Используем шаблон с названием «gradient» для заливки */
$draw -> setFillPatternURL ( ‘#gradient’ );
/* Устанавливаем размер шрифта в 52 */
$draw -> setFontSize ( 52 );
/* Добавляем свой текст */
$draw -> annotation ( 20 , 50 , «Hello World!» );
/* Создаём новый объект холста и белое изображение */
$canvas = new Imagick ();
$canvas -> newImage ( 350 , 70 , «white» );
/* Рисуем ImagickDraw на холсте */
$canvas -> drawImage ( $draw );
/* устанавливаем чёрную рамку шириной 1px вокруг изображения */
$canvas -> borderImage ( ‘black’ , 1 , 1 );
/* Устанавливаем формат PNG */
$canvas -> setImageFormat ( ‘png’ );
/* Вывод изображения */
header ( «Content-Type: image/png» );
echo $canvas ;
?>
Результатом выполнения данного примера будет что-то подобное:
Работа с анимированными GIF-изображениями
Пример #5 Чтение GIF изображения и изменение размера всех фреймов
/* Создание нового объекта imagick и чтение в GIF */
$im = new Imagick ( «example.gif» );
/* Изменение размера всех фреймов */
foreach ( $im as $frame ) /* фреймы 50×50 */
$frame -> thumbnailImage ( 50 , 50 );
/* Устанавливаем виртуальный холст для коррекции размера */
$frame -> setImagePage ( 50 , 50 , 0 , 0 );
>
/* Обратите внимание, writeImages вместо writeImage */
$im -> writeImages ( «example_small.gif» , true );
?>
Работа с примитивом «эллипс» и пользовательскими шрифтами
Пример #6 Create a PHP logo
/* Установка ширины и высоты в пропорции логотипа PHP */
$width = 400 ;
$height = 210 ;
?php
/* Создание объекта Imagick с поддержкой прозрачности */
$img = new Imagick ();
$img -> newImage ( $width , $height , new ImagickPixel ( ‘transparent’ ));
/* Новый объект ImagickDraw для отрисовки эллипса */
$draw = new ImagickDraw ();
/* Установка пурпурного цвета заливки для эллипса */
$draw -> setFillColor ( ‘#777bb4’ );
/* Задание размеров эллипса */
$draw -> ellipse ( $width / 2 , $height / 2 , $width / 2 , $height / 2 , 0 , 360 );
/* Отрисовка эллипса */
$img -> drawImage ( $draw );
/* Сброс цвета заливки с пурпурного на чёрный для текста (заметьте, что мы используем объект ImagickDraw повторно) */
$draw -> setFillColor ( ‘black’ );
/* Задание обводки границы белым цветом */
$draw -> setStrokeColor ( ‘white’ );
/* Задание толщины обводки */
$draw -> setStrokeWidth ( 2 );
/* Задание кернинга (отрицательные значения означают, что буквы будут ближе друг к другу) */
$draw -> setTextKerning (- 8 );
/* Задание шрифта и его размера, которые используются в логотипе PHP */
$draw -> setFont ( ‘Handel Gothic.ttf’ );
$draw -> setFontSize ( 150 );
/* Центрирование текста вертикально и горизонтально */
$draw -> setGravity ( Imagick :: GRAVITY_CENTER );
/* Добавление текста «php» со смещением по Y на -10 на холст (внутри эллипса) */
$img -> annotateImage ( $draw , 0 , — 10 , 0 , ‘php’ );
$img -> setImageFormat ( ‘png’ );
/* Установка соответвующего заголовка для PNG и вывод изображения */
header ( ‘Content-Type: image/png’ );
echo $img ;
?>
Результатом выполнения данного примера будет что-то подобное:
Создаём Instagram фильтры с помощью PHP и ImageMagick
PHP поставляется в комплекте с GD (GIF Draw / Graphics Draw). Её используют для простых операций с изображениями, такие как изменение размера, обрезка, добавление водяных знаков, создание миниатюр. К сожалению, если вы хотите создать что-то более сложное с GD не получится. К счастью, у нас есть ImageMagick!
GD vs. ImageMagick
Посмотрим на примере ресайза изображения.
$im = imagecreatefromjpeg('photo.jpg'); $ox = imagesx($im); $oy = imagesy($im); $nx = 640; $ny = 480; $nm = imagecreatetruecolor($nx, $ny); imagecopyresized($nm,$im,0,0,0,0,$nx,$ny,$ox,$oy); imagejpeg($nm, 'photo.jpg');
IM (сокращенно от ImageMagick) имеет хорошую оболочку, называется Imagick — родное расширение PHP для создания и редактирования изображений с помощью ImageMagick API. Единственный минус: устанавливается из PECL, который иногда может быть проблемой для виртуального хостинга.
$image = new Imagick('photo.jpg'); $image->resizeImage(640, 480, imagick::FILTER_LANCZOS, 0.9);
А с применением командной строки еще проще:
exec('mogrify -resize 640x480 photo.jpg');
Установка ImageMagick
Пройдите по ссылке, выберите платформу (Unix / Mac / Win) и выберите рекомендуемый пакет.
После завершения установки перейдите к терминалу/командной строке, введите convert и нажмите Enter, если вы получите список вариантов, а не «Команда не найдена», то все отлично! Обратите внимание, что вам не нужно ничего настраивать в PHP.
Instagraph — класс PHP
- colortone: воля цветового тона изображения в светах и/или тени.
- vignette: края изображения обесцвечиваются.
- border: добавляет границы к фотографии.
- frame: будет читать заданный кадр в соответствии с фото.
- tempfile: создает временный файл (копия оригинального изображения).
- output: переименование рабочего файла
- execute: посыл команды
Создайте новый файл с именем instagraph.php и вставьте следующий код.
/** * Instagram filters with PHP and ImageMagick * * @package Instagraph * @author Webarto * @copyright NetTuts+ * @license http://creativecommons.org/licenses/by-nc/3.0/ CC BY-NC */ class Instagraph < public $_image = NULL; public $_output = NULL; public $_prefix = 'IMG'; private $_width = NULL; private $_height = NULL; private $_tmp = NULL; public static function factory($image, $output) < return new Instagraph($image, $output); >public function __construct($image, $output) < if(file_exists($image)) < $this->_image = $image; list($this->_width, $this->_height) = getimagesize($image); $this->_output = $output; > else < throw new Exception('File not found. Aborting.'); >> public function tempfile() < # copy original file and assign temporary name $this->_tmp = $this->_prefix.rand(); copy($this->_image, $this->_tmp); > public function output() < # rename working temporary file to output filename rename($this->_tmp, $this->_output); > public function execute($command) < # remove newlines and convert single quotes to double to prevent errors $command = str_replace(array("\n", "'"), array('', '"'), $command); $command = escapeshellcmd($command); # execute convert program exec($command); >/** ACTIONS */ public function colortone($input, $color, $level, $type = 0) < $args[0] = $level; $args[1] = 100 - $level; $negate = $type == 0? '-negate': ''; $this->execute("convert ( -clone 0 -fill '$color' -colorize 100% ) ( -clone 0 -colorspace gray $negate ) -compose blend -define compose:args=$args[0],$args[1] -composite "); > public function border($input, $color = 'black', $width = 20) < $this->execute("convert $input -bordercolor $color -border x $input"); > public function frame($input, $frame) < $this->execute("convert $input ( '$frame' -resize _width>x_height>! -unsharp 1.5×1.0+1.5+0.02 ) -flatten $input"); > public function vignette($input, $color_1 = 'none', $color_2 = 'black', $crop_factor = 1.5) < $crop_x = floor($this->_width * $crop_factor); $crop_y = floor($this->_height * $crop_factor); $this->execute("convert ( ) ( -size x radial-gradient:$color_1-$color_2 -gravity center -crop _width>x_height>+0+0 +repage ) -compose multiply -flatten "); > /** RESERVED FOR FILTER METHODS */ >
Посмотрим что получается
Готэм-фильтр приводит изображение в черно-белое. Высокий контраст изображения с голубоватым оттенком.
public function gotham() < $this->tempfile(); $this->execute("convert $this->_tmp -modulate 120,10,100 -fill '#222b6d' -colorize 20 -gamma 0.5 -contrast -contrast $this->_tmp"); $this->border($this->_tmp); $this->output(); >
Напоминает старые снимки Polaroid, он имеет яркие цвета вместе с розовым/оранжевым свечением от центра. По словам генерального директора Instagram, это один из самых сложных эффектов.
public function toaster() < $this->tempfile(); $this->colortone($this->_tmp, '#330000', 100, 0); $this->execute("convert $this->_tmp -modulate 150,80,100 -gamma 1.2 -contrast -contrast $this->_tmp"); $this->vignette($this->_tmp, 'none', 'LavenderBlush3'); $this->vignette($this->_tmp, '#ff9966', 'none'); $this->output(); >
Вы даже можете добавить белую рамку для полного эффекта, просто добавьте
$this->border($this->_tmp, 'white'); перед $this->output();
public function nashville() < $this->tempfile(); $this->colortone($this->_tmp, '#222b6d', 100, 0); $this->colortone($this->_tmp, '#f7daae', 100, 1); $this->execute("convert $this->_tmp -contrast -modulate 100,150,100 -auto-gamma $this->_tmp"); $this->frame($this->_tmp, __FUNCTION__); $this->output(); >
public function lomo() < $this->tempfile(); $command ; $this->execute($command); $this->vignette($this->_tmp); $this->output(); >
public function kelvin() < $this->tempfile(); $this->execute("convert ( $this->_tmp -auto-gamma -modulate 120,50,100 ) ( -size _width>x_height> -fill 'rgba(255,153,0,0.5)' -draw 'rectangle 0,0 _width>,_height>' ) -compose multiply $this->_tmp"); $this->frame($this->_tmp, __FUNCTION__); $this->output(); >
Как это использовать?
Я предполагаю что вы сохранили весь код в файл instagraph.php. Теперь создайте файл с именем filter.php и скопируйте следующий код.
Если вы хотите применить только один фильтр, вы можете сделать это следующим образом:
require 'instagraph.php'; try < $instagraph = Instagraph::factory('input.jpg', 'output.jpg'); >catch (Exception $e) < echo $e->getMessage(); die; > $instagraph->toaster(); // имя фильтра
Вот и все! Если вы хотите применить все фильтры используйте этот код:
require 'instagraph.php'; try < $instagraph = Instagraph::factory('input.jpg', 'output.jpg'); >catch (Exception $e) < echo $e->getMessage(); die; > // loop through all filters foreach(array('gotham', 'toaster', 'nashville', 'lomo', 'kelvin') as $method) < $instagraph->_output = $method.'.jpg'; // we have to change output file to prevent overwrite $instagraph->$method(); // apply current filter (from array) >
Производительность
Производительность, безусловно, является важной частью в любой области применения. Применение фильтра к изображению составляет примерно 1 секунду, мы можем с уверенностью сказать что это очень быстро!