Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Image::Magick или фотошоп для Perl

leonidp@yandex.ru, Леонид Палагин
9 ноября 2002 г.

Если вы занимались когда-либо обработкой изображений с помощью perl. То Вы наверное знаете, что то средство, которое нам предлагается повсюду не всегда хорошо подходит для наших нужд. Я конечно имею ввиду модуль GD. Почему он нам не подходит?

Начну по-порядку.

Во-первых, при resize изображения:

$thumb->copyResized($srcImage,0,0,0,0,$oxn,$oyn,$ox,$oy);

Мы получаем очень, не качественно уменьшенную (или увеличенную) картинку, да и еще не качественно закомпрессированную. Например, в моем случае 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
#Делаем resize (изменения размера)
$image->Resize(geometry=>geometry, width=>$nx, height=>150);
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"); #Сохраняем изображение.

Результат. Картинка 200х150 великолепного качества. 4206 bytes.

Как видите всё проще пареной репы. :)

Таким образом мы можем получить, например, из 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"); #открываем файл
$image->Contrast(); #Контрастность
$image->Normalize(); #Нормализуем
$x = $image->Write("photo.jpg"); #Сохраняем изображение.

Получаем. 4647 bytes.

Сделаем изображение черно-белым.

use Image::Magick; #используем модуль
my($image, $x); #переменные
$image = Image::Magick->new; #новый проект
$x = $image->Read("photo.jpg"); #открываем файл
$image->Quantize(colorspace=>'gray');
$x = $image->Write("photo.jpg"); #Сохраняем изображение.

Получаем. 4159 bytes.

Очень часто нам нужно конвертировать изображения из одного формата в другой. Сделать это также легко.

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.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
30K
25 мая 2007 года
oleg_fox
0 / / 25.05.2007
+0 / -3
Мне нравитсяМне не нравится
25 мая 2007, 14:10:44
Статье уже 5 лет, а я только наткнулся на неё.
Но меня порадовал автор:
модуль GD. Почему он нам не подходит?
Во-первых, при resize изображения:
$thumb->copyResized($srcImage,0,0,0,0,$oxn,$oyn,$ox,$oy);
Мы получаем очень, не качественно уменьшенную (или увеличенную) картинку
Итак. Image::Magick со всем справляется великолепно.
Автор обрезает картинку, заместо resize изображения для GD
СОВСЕМ ОДИНАКОВЫЕ ОПЕРАЦИИ, КАК ВЫ ДУМАЕТЕ!
2.
Аноним
Мне нравитсяМне не нравится
6 августа 2005, 01:31:41
А я уже нашел применение этому (обрезаю аватары на своем форуме :)
3.
Аноним
Мне нравитсяМне не нравится
20 марта 2005, 08:01:11
А нельзя ли просто программу для Windows без всякого программирования со стороны пользователя?
4.
Аноним
Мне нравитсяМне не нравится
8 октября 2004, 11:28:22
Афтор, учить русский немедленно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог