Статьи

Имагик против GD

Вступление

Если вы хотите создать миниатюру, применить фильтр к изображению или преобразовать его любым другим способом, вам придется использовать библиотеку обработки изображений в вашем PHP-приложении. Это означает, что вы, вероятно, выберете GD или ImageMagick . Но какой из них поддерживает более широкий спектр форматов изображений? Может быть, один из них медленнее другого? Какие еще критерии должны быть приняты во внимание при выборе правильной библиотеки? Прочитайте статью, чтобы узнать!

Доступность

И GD, и ImageMagick доступны в PHP при условии, что они были установлены и настроены вместе с самим PHP. Библиотека GD включена по умолчанию начиная с PHP 4.3, поэтому вы, вероятно, сможете использовать ее в своем проекте в большинстве серверных сред. С другой стороны, ImageMagick не всегда доступен, и некоторые хостинговые компании не включают его в свое предложение.

Вы можете запустить несколько строк кода, чтобы проверить доступность обеих библиотек. Функции ImageMagick queryFormats()gd_info()

 if(extension_loaded('gd')) {
    print_r(gd_info());
}
else {
    echo 'GD is not available.';
}

if(extension_loaded('imagick')) {
    $imagick = new Imagick();
    print_r($imagick->queryFormats());
}
else {
    echo 'ImageMagick is not available.';
}

Поддерживаемые типы файлов

Список поддерживаемых форматов изображений, которые будут распечатаны после выполнения кода, является первым признаком того, что библиотека ImageMagick предлагает гораздо больше функциональных возможностей, чем другой. GD поддерживает только файлы JPG, PNG, GIF, WBMP, WebP, XBM и XPM, что мало по сравнению с более чем сотней типов файлов, обрабатываемых библиотекой ImageMagick.

Вы можете подумать, что вы, вероятно, никогда не будете использовать все эти необычные типы файлов, поддерживаемые ImageMagick, но это может быть не так. В одном из моих проектов мне пришлось перейти с GD на ImageMagick только потому, что первый не поддерживает файлы TIFF.

функциональность

И GD, и ImageMagick предлагают некоторые базовые функции, такие как:
— изменение размера и обрезка изображений,
— создание изображений, которые состоят из пользовательских форм, текста и других файлов изображений,
— применение фильтров изображения (изменение яркости, контрастности, цветности и т. Д.).

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

Класс PHP ImageMagick331 метод, что является довольно внушительным числом (нет, я не считал их вручную, я использовал ReflectionClass С одной стороны, он показывает большой охват библиотеки ImageMagick, а с другой — затрудняет поиск и реализацию подходящего метода для конкретного варианта использования.

Производительность

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

В серии тестов, которые я проводил на типичной конфигурации сервера, создание миниатюрного изображения с 3- мегабайтного JPG-изображения с цифровой камеры заняло около 0,6 с использованием ImageMagick и около 0,5 с использованием GD. Таким образом, весь процесс не занимает много времени, независимо от того, какая библиотека используется. И после просмотра веб-страниц и поиска тестов скорости обеих библиотек вы быстро заметите, что ни одна из них не выделяется с точки зрения производительности. Иногда библиотека GD работает быстрее, иногда ImageMagick — это просто зависит от варианта использования. Не принимайте этот критерий как решающий при принятии решения, использовать ли GD или ImageMagick.

Стиль кодирования

Если вы сравните код, отвечающий за то же преобразование изображения, написанное с использованием GD и библиотеки ImageMagick, вы быстро заметите, что есть несколько отличий. Библиотека GD доступна через набор функций, таких как getimagesize()imagecreatetruecolor() Давайте посмотрим пример создания эскиза изображения JPG:

 $src_img = imagecreatefromjpeg('source.jpg');
if(!$src_img) {
    die('Error when reading the source image.');
}
$thumbnail = imagecreatetruecolor(800, 800);
if(!$thumbnail) {
    die('Error when creating the destination image.');
}
$result = imagecopyresampled($thumbnail, $src_img, 0, 0, 0, 0, 800, 800, 1600, 1600);
if(!$result) {
    die('Error when generating the thumbnail.');
}
$result = imagejpeg($thumbnail, 'destination.jpg');
if(!$result) {
    die('Error when saving the thumbnail.');
}
$result = imagedestroy($thumbnail);
if(!$result) {
    die('Error when destroying the image.');
}

Поскольку исключения не генерируются в случае ошибки, вся обработка ошибок должна быть реализована путем проверки результата каждой функции GD. Вы также должны иметь дело с чудовищными функциями, имеющими десять аргументов, такими как imagecopyresampled()imagecopyresized() Я убежден, что такое количество аргументов не является примером хорошей практики кодирования.

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

 switch($image_type) {
    case 'gif' :
        $src_img = imagecreatefromgif($path);
        break;
    case 'png' :
        $src_img = imagecreatefrompng($path);
        break;
    case 'jpg' :
    case 'jpeg' :
        $src_img = imagecreatefromjpeg($path);
        break;
    default:
        return false;
        break;
}

//continue with creating the thumbnail

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

Просто посмотрите на код ImageMagick, ответственный за ту же операцию, и вы заметите разницу:

 try {
    $imagick = new Imagick();
    $imagick->readImage('source.jpg');
    $imagick->thumbnailImage(800, 800);
    $imagick->writeImage('destination.jpg');
}
catch(Exception $e) {
    die('Error when creating a thumbnail: ' . $e->getMessage());
}

Библиотека ImageMagick доступна через класс Imagick Таким образом, мы можем извлечь выгоду из всех преимуществ парадигмы объектно-ориентированного программирования. Простейшим примером является способ обработки ошибок. При использовании библиотеки ImageMagick вы можете просто обернуть весь код в блок try-catch, и ваше приложение можно будет безопасно выполнить.

Как вы можете видеть выше, скрипт ImageMagick, отвечающий за создание миниатюры, не содержит кода, связанного с типом исходного изображения. Один и тот же код может использоваться для обработки изображений JPG, а также файлов PNG или TIF. И если вам нужно преобразовать исходное изображение в другой тип, просто добавьте одну строку кода перед выполнением writeImage()

 $image->setImageFormat('PNG');

Разве это не более понятно? На мой взгляд, обработка изображений с использованием функций библиотеки GD не так удобна, как с ImageMagick. Конечно, для GD доступны различные оболочки, которые делают его объектно-ориентированным, но в этот момент начинает ощущаться необходимость исправления патча.

популярность

Поскольку библиотека GD включена по умолчанию во все новые версии PHP, вы, вероятно, будете видеть эту библиотеку в различных проектах чаще, чем ImageMagick. Когда мне нужно было включить в проект CakePHP компонент, отвечающий за загрузку изображений и создание миниатюр, я быстро нашел тот, который отвечал моим потребностям, на основе GD. Иногда вы можете найти некоторые хорошо написанные модули, которые позволяют выбирать между двумя библиотеками обработки изображений — например, библиотека изображений инфраструктуры Kohana , но я боюсь, что они не так часты.

альтернативы

Решая, как обрабатывать изображения в вашем приложении, вам не нужно придерживаться той или иной библиотеки PHP. Есть и другие решения, которые стоит рассмотреть:

1. Используйте скрипт обработки изображений, который работает вне приложения PHP.
В одном из моих приложений я должен был создать веб-страницу, позволяющую посетителю преобразовать изображение онлайн, просто в окне браузера. Я решил использовать JavaScript-библиотеку Caman.js для обработки изображений, которая отлично справилась со своей задачей. Библиотека также может использоваться в качестве фонового скрипта, встроенного в платформу node.js, которая неуклонно набирает популярность.

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

3. Проверьте функциональность компонентов, которые вы уже используете.
Вы можете быть удивлены, обнаружив, что вы можете преобразовать свои изображения, используя службу, уже подключенную к вашему приложению. Например, Dropbox API предлагает метод thumbnails Проверьте документацию своих библиотек и API, и, возможно, вы обнаружите, что они могут делать то, что вам нужно.

Резюме

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

ImageMagick поддерживает больше типов файлов и может преобразовывать изображения гораздо большим количеством способов, чем библиотека GD. Это также позволяет писать код более высокой четкости и качества.

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

Если у вас есть какие-либо вопросы или комментарии относительно статьи, не стесняйтесь оставлять комментарии ниже или свяжитесь со мной через Google+ .