PHP: Пример использования Imagick

Задача: сделать красивые превью-изображения для новостей с эффектами тени, округлых углов и серых границ.

Из большого в маленькое с эффектами

Из большого в маленькое с эффектами

Решение: использование расширения ImageMagick (Imagick).

Imagick — это программа для Linux для работы с изображениями. Она имеет множество интерфейсов для огромного числа языков программирования, в т.ч. и для php. Для debian-based (типа Ubuntu) систем легко ставится из консоли командой

apt-get install imagemagick
apt-get install php5-imagick

Я использую обработку и загрузку изображения в рамках обработки полученных данных от Zend_From, поэтому в коде $form — это экземпляр Zend_Form.

// if preview image is uploaded
if($form->preview AND $form->preview->isUploaded()) {
	$form->preview->receive();
	$imgPath4Db = '/media/news/previews/' . $id . '.png';
	// Make neccery folders if needed
	@mkdir ($this->mediaPath . '/media/news/previews/', 0755, true);
	$imgPath = $this->mediaPath . $imgPath4Db;
	$imgPath = realpath($imgPath);

	// Size of thumbnail
	$width = 102;
	$height = 63;

	// Make thumbnail and upload image to neccery folder
	$thumb = new Imagick($form->preview->getFileName());
	$thumb->cropThumbnailImage($width, $height);
	$thumb->roundCorners(1, 1);

	// Create round corners via new image
	$borders = new Imagick();
	$borders->newImage($width+2, $height+2, new ImagickPixel('#999999'), 'png');
	$borders->roundCorners(1, 1);

	// Get the image geometry
	$geometry = $thumb->getImageGeometry();
	// The overlay x and y coordinates
	$x = ( $width - $geometry['width'] ) / 2;
	$y = ( $height - $geometry['height'] ) / 2;

	// Create and add over white bg
	$bg = new Imagick();
	$bg->newImage($width, $height, new ImagickPixel('#ffffff'), 'png');
	$bg->roundCorners(1, 1);
	$borders->compositeImage($bg, Imagick::COMPOSITE_OVER, 1, 1);

	// Add image itself
	$borders->compositeImage($thumb, Imagick::COMPOSITE_OVER, $x+1, $y+1);

	// Clone preview for making shadow
	$shadow = $borders->clone();
	// Shadow color
	$shadow->setImageBackgroundColor(new ImagickPixel("#333333"));
	// Making shadow
	$shadow->shadowImage(55, 2.5, 0, 0);
	// Overlay image with borders to shadow image
	$shadow->compositeImage($borders, Imagick::COMPOSITE_OVER, 5, 5);
	try {
		$shadow->writeImage($imgPath);
	} catch (Exception $e) {
		echo $e->getMessage();
	}
	// Clean up!
	$borders->destroy();
	$shadow->destroy();
	$thumb->destroy();

	// Update record in DB
	$data = array('preview' => $imgPath4Db);
	$this->update($data, 'id = "'.$id.'"');
}

Как это работает

  1. Создаем объект Imagick, при этом в конструкторе даем саму картинку, полученную из посланной формы;
  2. По-умному (то есть пытаемся уместить картинку так, чтобы сохранились пропорции) обрезаем до нужных размеров и округляем углы;
  3. Создаем новую картинку больше оригинала по 2 пикселя по ширине и высоте — прямоугольник залитый серым цветом — основа для границ изображения, и округляем его границы;
  4. Объединяем серый прямоугольник с обрезанным изображением;
  5. Создаем новую картинку — клон объединенных границ с превью. Добавляем к ней эффект тени;
  6. Объединяем полученную тень с превью-изображением;
  7. Сохраняем полученное творчество на сервер в формате PNG.

Ссылки в записи

  1. Мануал по ImageMagick
  2. Пакет php5-imagick для установки Imagick в Ubuntu
  3. Хороший блог об использовании Imagick в php с примерами
  • Amurdel

    Спасибо за статью, хоть кто-то описал как оно работает

  • Amurdel

    Спасибо за статью, хоть кто-то описал как оно работает