Обрезка и изменение размеров изображения с помощью класса Imagick 


Обрезка и изменение размеров изображения с помощью класса Imagick

Опубликовано

Если ваш сайт поддерживает загрузку изображений, то наверняка у вас есть желание, чтобы все они были оформлены по определенному шаблону. Напрашиваются два варианта, как этого достичь. Первый доверить пользователю, урезку ужимку и прочие действия над изображением, однако не стоит так уж сильно надеяться на него, обычный посетитель может не иметь программного обеспечения для работы с изображением или попросту не знать, как с ним обращаться. Второй вариант, доверить манипуляции над изображением специализированному скрипту. Именно о втором варианте и пойдет речь в статье.

Отличным решением является встроенное PHP расширение Imagick, нацеленное на работу c изображением, использует ImageMagick API. В арсенале класса Imagick присутствует богатый перечень методов для создания, редактирования, компоновки изображений, в статье я рассмотрю два наиболее востребованных:

  • cropImage() – урезка изображений;
  • thumbnailImage() – изменение размера изображений;

Урезка изображения cropImage()

cropImage(width, height, offset x, offset y) – метод урезает часть изображения. Первые два параметра метода (width, height) указывают ширину и высоту урезаемой области, вторые два параметра (offset x, offset y) позицию места, откуда начинается урезка, относительно начала картинки, возвращает булево значение true в случае успешной урезки.

Схема урезки изображения

Рис 1.Урезка изображения методом cropImage()

Листинг 1. Урезка изображения.

$inFile = "photo.jpg";
$outFile = "photo-cropped.jpg";
$image = new Imagick($inFile);
$image->cropImage(400, 400, 30, 10);
$image->writeImage($outFile);

writeImage() - метод сохраняющий результат работы на диск, в качестве параметра указывается имя нового изображения, если имя файла не указано, то изменения будут применены к текущей картинке.

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

thumbnailImage(width, height, bestfit) – метод уменьшает размер изображения.

Аргументы width и height соответственно ширина и высота отредактированного изображения. Если значение ширины или высоты равно 0, то размер изображения выставляется по второму параметру, а аргумент с 0 значением подгоняется пропорционально.

Необязательный третий параметр bestfit может принимать значения true(по умолчанию), false. Данный аргумент пригодится, если исходное изображение меньше размеров указанных в методе thumbnailImage() (к примеру, исходные 300x200, а в результате оно должно стать 450x300), указав bestfit = false изображение увеличиться до требуемых размеров, однако потеря качества картинки неизбежно.

Листинг 2. Изменение размера изображения.

$inFile = "photo.jpg";
$outFile = "image_resized.jpg";
$image = new Imagick($inFile);
$image->thumbnailImage(400,0);
$image->writeImage($outFile);

Пример

Листинг 3. Форма для отправки изображения на сервер. Файл index.php

<!doctype html>
<html>
<head>
 <title> Форма для отправки изображения на сервер </title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
 <label>Изображение: <input type="file" name="file" id="file"></label>
 <input type="submit" name="submit" value="Загрузить и урезать">
</form> 
</body>
</html>

Листинг 4. Php сценарий для обработки изображения. Файл upload.php

<?php
 if (isset($_FILES["file"])) {
  $tmpFile = $_FILES["file"]["tmp_name"];
  //Имя изображения
  $fileName = "image_resized.jpg";

  list($width, $height) = getimagesize($tmpFile);
  // Проверка, является ли файл действительно изображением
  if ($width == null && $height == null) {
   header("Location: index.php");
   return;
  }
  // Изменение размеров если это необходимо
  if ($width >= 400 && $height >= 400) {
   $image = new Imagick($tmpFile);
   $image->thumbnailImage(400,0);
   $image->writeImage($fileName);
  }else{
   move_uploaded_file($tmpFile, $fileName);
  }
}
?>

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