Если вы занимались когда-либо обработкой изображений с помощью perl. То Вы наверное знаете, что то средство, которое нам предлагается повсюду не всегда хорошо подходит для наших нужд. Я конечно имею ввиду модуль GD. Почему он нам не подходит? Начну по порядку. Во-первых, при resize изображения:
Мы получаем очень, не качественно уменьшенную (или увеличенную) картинку, да и еще не качественно закомпрессированную. Например, в моем случае GD из jpeg изображения 640х480 (25 kb) при уменьшении в 200х150 создавала не качественное изображение весом всего на 20% меньше (~20kb). Хотя при уменьшении ACDSee 5 (ACD FotoCanvas Lite 2.0) картинка занимала всего ~5 kb и при этом была отличного качества. Вы подумаете, мол сохраняй её по-человечески, задай уровень сжатия jpeg - 80 и всё будет путем. Ан нет.
print OUT $thumb->jpeg(80);
Результат еще хуже. Размер больше изначального.
Во-вторых, не внушает список функция GD. Нет, он внушает, но предназначен не много не для наших целей. С помощью GD удобно сделать надпись на точном изображении. В особенности .PNG. А например обрезать изображение, вытянуть, поменять цвета и вставить в него другое изображение с помощью GD уже не удобно.
В-третьих, у нас нет возможности делать GIF изображения. В том числе анимационные .gif файлы. Что тоже хочется.
Итак. Image::Magick со всем справляется великолепно. Покажу для начала пример, изменения картинки jpg.
Есть photo.jpg. Размер 640х272. Замечу что фото изначально не очень качественное. 12621 bytes.
Задача сделать чтобы она была размером 200х150.
use Image::Magick; #используем модуль my($image, $x); #переменные $image = Image::Magick->new; #новый проект $x = $image->Read("photo.jpg"); #открываем файл ($ox,$oy)=$image->Get('base-columns','base-rows'); #определяем ширину и высоту изображения
$nx=int(($ox/$oy)*150); #вычисляем ширину, если высоту сделать 150 $image->Resize(geometry=>geometry, width=>$nx, height=>150); #Делаем resize (изменения размера) if($nx>200) { #Если ширина получилась больше 200 $nnx=int(($nx-200)/2); #Вычисляем откуда нам резать $image->Crop(x=>$nnx, y=>0); #Задаем откуда будем резать $image->Crop('200x150'); #С того места вырезаем 200х150 } $x = $image->Write("photo.jpg"); #Сохраняем изображение.
Как видите всё проще пареной репы. :) Таким образом мы можем получить, например, из 300х180. Изображение 200х150. Что очень удобно, для сайтов с ограниченным дизайном. К примеру, если это иллюстрация к статьям, и Вы хотите чтобы картинки были одинакового размера. Есть в этом примере и один недостаток. Это - если ширина меньше 200, что изображение будет уже неодинакового размера. То есть при высоте 150 ширина будет меньше 200. Изменить этот недостаток очень легко. Нужно всего лишь проверить что больше ширина/200 или высота/150 и если больше высота/150, то изменять размер не ширины, а высоты и резать не ширину, а высоту.
Следующий пример. Выравнивает контрастность и нормализирует цвета.
Очень часто нам нужно конвертировать изображения из одного формата в другой. Сделать это также легко.
use Image::Magick; #используем модуль my($image, $x); #переменные $image = Image::Magick->new; #новый проект $x = $image->Read("photo.jpg"); #открываем файл jpg $x = $image->Write("photo.png"); #Сохраняем изображение png.
В результат изображение в формате png.
Так мы сможем открыть gif изображение. В данном случае первый фрейм.
$x = $image->Read("photo.gif[0]");
Полный набор возможностей и инструментов Вы найдете в документации модуля здесь. Возможности на самом деле сопоставимы с возможностями фотошопа. Но всё же, Image::Magick хорош именно для редактирования изображений. Для точных изображений, рекомендую всё же использовать GD.