Статьи

Кадрирование и изменение размера изображений с помощью ImageMagick

Если ваш веб-сайт позволяет пользователям загружать фотографии, функция обрезки / изменения размера изображения, безусловно, пригодится. Но пользователи могут не иметь доступа к инструментам обработки изображений, таким как Photoshop, поэтому, предоставляя функцию обрезки / изменения размера, вы можете позволить пользователям загружать фотографии с любого устройства (например, планшета или телефона), не беспокоясь о конечном размере. Кроме того, вы можете создавать разные версии одного и того же изображения, а также разрешать пользователям обрезать определенные части загруженного изображения.

В этой статье я покажу вам, как создать инструмент обрезки изображений с помощью PHP-расширения ImageMagick. В этом руководстве предполагается, что у вас уже установлено расширение, поэтому в противном случае обязательно прочитайте руководство .

Знакомимся

Расширение ImageMagick выполняет обработку изображений с использованием библиотеки ImageMagick. ImageMagick предоставляет множество методов API, с помощью которых вы можете манипулировать изображением. Он предлагает простой объектно-ориентированный интерфейс для использования API; вам просто нужно создать экземпляр класса Imagick

Поскольку мы собираемся создать обрезку изображения, мы в основном будем использовать два метода: cropImage()thumbnailimage()

обрезать изображение

Метод cropImage() Первые два аргумента указывают высоту и ширину обрезанной области, а последние два указывают координаты X и Y верхнего левого угла обрезанной области.

Например:

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

Сначала мы создаем объект Imagick Затем мы вызываем cropImage() В этом случае код создаст обрезанное изображение размером 400 × 400 пикселей, начиная с 30 пикселей сверху и с 10 пикселей слева от исходного изображения. Наконец, writeImage()

миниатюрное изображение

Метод thumbnailImage()

 <?php
$inFile = "test.jpg";
$outFile = "test-thumbnail.jpg";
$image = new Imagick($inFile);
$image->thumbnailImage(200, 200);
$image->writeImage($outFile);

Приведенный выше код создает версию изображения размером 200 × 200 пикселей. Если аргумент width или height для thumbnailImage()

Мы также можем передать третий аргумент, известный как bestfit ; Если установлено значение true, размер изображения будет изменен таким образом, чтобы новые размеры могли содержаться в пределах указанных высоты и ширины. Например, вызов thumbnailImage(400, 400, true) Новые размеры меньше или равны указанным размерам.

Теперь, когда вы знакомы с этими двумя методами, мы готовы к работе.

Загрузка и обрезка

Конечно, нам нужно создать HTML-форму, с помощью которой пользователи смогут загружать фотографии:

 <form action="upload.php" method="post" enctype="multipart/form-data">
 <label for="file">Image:</label>
 <input type="file" name="file" id="file"><br>
 <input type="submit" name="submit" value="Upload and Crop">
</form>

Как только пользователь нажимает кнопку загрузки, в сценарий будет отправлен запрос POST, который будет обрабатывать процесс загрузки файла и показывать загруженное изображение пользователю для обрезки. Помните, что при загрузке файлов вам нужно установить атрибут enctype

Скрипт загрузки обрабатывает загрузку изображения и при необходимости изменяет его размер.

 <?php
if (isset($_FILES["file"])) {
    $tmpFile = $_FILES["file"]["tmp_name"];
    $fileName = ... // determine secure name for uploaded file

    list($width, $height) = getimagesize($tmpFile);
    // check if the file is really an image
    if ($width == null && $height == null) {
        header("Location: index.php");
        return;
    }
    // resize if necessary
    if ($width >= 400 && $height >= 400) {
        $image = new Imagick($tmpFile);
        $image->thumbnailImage(400, 400);
        $image->writeImage($fileName);
    }
    else {
        move_uploaded_file($tmpFile, $fileName);
    }
}

При приеме файлов от пользователей вы должны быть очень осторожны, поскольку кто-то может загрузить вредоносный файл на ваш сервер, если вы не создадите систему безопасной загрузки. Для получения дополнительной информации прочитайте статью « Загрузка файлов с помощью PHP» , уделив особое внимание разделу «Вопросы безопасности».

Функция getimagesize() Кроме того, вы также можете проверить тип изображения и размер файла с помощью getimagesize()

Поскольку сценарий уже знает ширину и высоту загруженного изображения в этой точке, он может определить, следует ли уменьшить размер изображения. Если размеры превышают 400 × 400 пикселей, его размер изменяется, чтобы создать миниатюру размером 400 × 400 пикселей, вызывая thumbnailImage() Как я объяснил ранее, метод принимает два параметра: ширину и высоту. Если вы хотите сохранить соотношение сторон изображения, рекомендуется передать 0 в качестве одного из аргументов.

Наконец, измененное изображение сохраняется с помощью writeImage()move_uploaded_file()

Сохраненное изображение выводится в браузер, чтобы пользователь мог обрезать его. Чтобы позволить пользователям выбирать определенную часть изображения, я использую плагин jQuery под названием ImageAreaSelect . Чтобы использовать плагин, должна быть доступна библиотека jQuery, а также файлы плагина CSS и JavaScript.

 <script type="text/javascript" src="scripts/jquery.min.js"></script>
<script type="text/javascript" src="scripts/jquery.imgareaselect.pack.js"></script>
<link rel="stylesheet" type="text/css" href="css/imgareaselect-default.css">

Для инициализации плагина вы можете использовать следующий код:

 selection = $('#photo').imgAreaSelect({
    handles: true,
    instance: true
});

#photo Установив handlesinstanceselectionselection Благодаря getSelection()

getSelection().width Например, getSelection().x1 Точно так же вы можете использовать getSelection().y1onclick

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

 $("#crop").click(function(){
    var s = selection.getSelection();
    var width = s.width;
    var height = s.height;
    var x = s.x1;
    var y = s.y1;
    ...
});

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

 var request = $.ajax({
    url: "crop.php",
    type: "GET",
    data: {
        x: x,
        y: y,
        height: height,
        width: width,
        image: $("#photo").attr("src")
    }
});

Когда запрос завершается, изображение перезагружается, поэтому вместо старого изображения будет показана новая обрезанная версия.

 request.done(function(msg) {
    $("#photo").attr("src", msg);
    selection.cancelSelection();
});

Когда обрезка завершена, запрос возвращает имя обрезанного изображения, и новое изображение загружается путем изменения атрибута src

Так как же выглядит сценарий обрезки?

 <?php
$file = basename($_GET["image"]);
$cropped = "cropped_" . $file;
$image = new Imagick($file);
$image->cropImage($_GET["width"], $_GET["height"], $_GET["x"], $_GET["y"]);
$image->writeImage($cropped);
echo $cropped;

Сначала скрипт извлекает имя изображения, которое нужно обрезать; имя изображения будет полным URL-адресом в виде http://example.com/path/image.jpg , но необходима только часть image.jpg . Затем строка «обрезается» имеет префикс к исходному имени, поэтому она будет выглядеть как cropped_image.jpg . Это позволяет сохранить обрезанное изображение без перезаписи оригинала.

Метод cropImage() Имя обрезанного изображения затем возвращается в запрос Ajax для отображения в браузере.

Вывод

В этой статье я создал простой инструмент обрезки, чтобы показать вам мощь и простоту использования расширения ImageMagick. Вы можете узнать больше об этом, проявить творческий подход и сделать что-то более полезное, используя его мощный API. Например, если вы хотите расширить то, что я здесь представил, вы можете предоставить пользователям возможность загружать их изображения в разных размерах. Пример кода, сопровождающего эту статью , доступен на GitHub для начала работы.

Изображение через Fotolia

И если вам понравилось читать этот пост, вы полюбите Learnable ; место, чтобы узнать новые навыки и приемы у мастеров. Участники получают мгновенный доступ ко всем электронным книгам SitePoint и интерактивным онлайн-курсам, таким как Jump Start PHP .

Комментарии к этой статье закрыты. Есть вопрос по PHP? Почему бы не спросить об этом на наших форумах ?