Примеры php imagemagick php

Примеры 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» );

/* Миниатюра изображения */
$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 ;

/* Создание объекта 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

image

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
  1. colortone: воля цветового тона изображения в светах и/или тени.
  2. vignette: края изображения обесцвечиваются.
  3. border: добавляет границы к фотографии.
  4. frame: будет читать заданный кадр в соответствии с фото.
  5. tempfile: создает временный файл (копия оригинального изображения).
  6. output: переименование рабочего файла
  7. 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 */ > 
Посмотрим что получается

image

Готэм-фильтр приводит изображение в черно-белое. Высокий контраст изображения с голубоватым оттенком.

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 секунду, мы можем с уверенностью сказать что это очень быстро!

Источник

Читайте также:  Php content transfer encoding quoted printable
Оцените статью