Если вы занимались когда-либо обработкой изображений с помощью 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.

Image::Magick или фотошоп для perl. Работа с графикой на Perl

Задача сделать чтобы она была размером 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"); #Сохраняем изображение.
Information
  • Posted on 27.04.2013 15:29
  • Просмотры: 537