WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




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


Прислал: Леонид Палагин [ 11.11.2002 @ 10:23 ]
Раздел:: [ Статьи по Perl ]


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


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


Результат. Картинка 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.

Комментарии пишите в форум //forum.768.ru/page_general_1036869716.html или лично на leonidp@yandex.ru

Перепечатка приветствуется при сохранении гиперссылок.

Леонид Палагин (//forum.768.ru/page_general_1036869716.html)
9 ноября 2002 г.


 :::::  FILA пишет 14.11.2002 @ 19:38 
А под PHP это можно заставить работать?
 :::::  Леонид П. пишет 16.11.2002 @ 00:54 
FILA> ИМХО, нет!
 :::::  UNHOLY пишет 19.11.2002 @ 08:38 
Хорошая статья.
 :::::  capsDlock пишет 10.12.2002 @ 06:22 
заманчиво :) интересно а более продвинуто можно, например, полностью управлять методом сжатия?
где скачать этот модуль?
 :::::  =KRoN= пишет 16.01.2003 @ 15:34 
На PHP это тоже можно, но не так удобно. В ImageMagick есть полный комплект консольных утилит на все эти операции. Т.е. просто вызывать внешние программы и всё.
 :::::  Xen пишет 06.03.2003 @ 03:55 
Через copyResized(....) модуля GD все жмется замечательно, правда и гадится немного.
Нашел опечатку в статье:
($ox,$oy)=$image->Get('base-columns','base-rows');
Правильно будет: ($ox,$oy)=$image->Get('base_columns','base_rows');

 :::::  Petrovich пишет 21.03.2003 @ 13:46 
Вот есть 2 картинки: маленькая и большая. Как на фоне большой разместить маленькую и всё это сохранить?
 :::::  aleandr пишет 15.04.2003 @ 13:23 
Petrovich, смотри в формуме по модулям Perl на www.xpoint.ru
 :::::   пишет 25.04.2003 @ 18:44 
чтим документацию внимательней.
API PHP - A native php-extension to ImageMagick.
http://pear.php.net/package-info.php?package=imagick
 :::::  Zlomrak пишет 21.07.2003 @ 23:37 
э...я вообще-то практически новичок в этом деле,
можно ли при помощи этого модуля проделать вот какую вещь...

Есть папка с картинками размера 500х400 (к примеру)...
Мне надо чтобы скрипт выводил предпросмотровые картинки размером 100х90 (к примеру) при нажатии на которые открывалась бы уже большая картинка...
то есть мне не надо чтоб были отдельные предпросмотровые картинки в отдельной директории,
а просто чтоб выводились маленькие в момент вызова скрипта...возможно ли это ?..

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

заранее Спасибо за ответ


 :::::  Andy пишет 26.08.2003 @ 16:11 
Все отлично можно. Главное выдавать правильный "Content-Type" перед выводом картинки.
 :::::  divikan пишет 04.11.2003 @ 12:24 
Класная вещь ImageMagick , Мне удавалось даже написать скрипт по распознаванию простых картинок из цифр на этой штуке.
 :::::   пишет 21.04.2004 @ 09:39 
7
 :::::  Ligro пишет 26.04.2004 @ 14:19 
Может кто подскажет, как консольными утилитами добиться нормального сжатия? Может в гиф перегонять?
А то пробовал и цветов порезать и кволити поменять меньше 35К картинка размером 98х74 не получается
 :::::  Dim пишет 09.07.2004 @ 01:04 
Image::Magick замечательная утилита, и соответственно и статья такая же!
Все может, и даже такому чайнику как я - помогла, работает на версиях perl 5.005, что немаловажно для консервативных хостинг провайдеров.
 :::::  Dmitry пишет 29.10.2004 @ 19:40 
Инсталлируется, но не работает на Perl 5.8
инсталлируется и иногда работает, но часто приводит к перезагрузке компа на perl 5.6
скачал и попробовал кучу разных дистрибутивов - не помогает
вобщем пришлось выбрать GD
а была необходимость изменять размер картинки "на лету"
 :::::  Archi пишет 10.11.2004 @ 09:39 
а где можно скачать версию для PHP или пёрл под Win 2003 server ??
 :::::  soko1 пишет 02.04.2010 @ 16:17 
Нашёл ошибку.
Не:

$image->Resize(geometry=>geometry, width=>1000, height=>$nx);

(хотя в документации почему-то тоже так)

А:

$image->Resize(geometry=>"geometry", width=>1000, height=>$nx); # с кавычками "geometry"

Не знаю как у вас, а у меня perl ругался.

Спасибо за статью! Выручили!
Имя:
Email:
URL

Введите сумму двух чисел девять и шесть (девять+шесть=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0115559