Изменение размеров графических изображений внешними программами
Автор:
[11 ноября 2005]
Версия: 1.0.3.4
Тэги: Графика
Я долго бился, как наверно и многие, над тем, чтобы научиться делать превью (маленькие изображения) для картинок. Ведь это бы дало возможность создавать с помощью Parser фото галереи, размещать картинки в новостях и т.д. Мне нужен был универсальный инструмент, который бы не цеплялся к формату файла (jpg, gif, png), умел производить различные манипуляции с изображениями и был способен выдавать адекватный, предсказуемый результат.
Такой инструмент называется ImageMagick, одна из самых мощных библиотек работы с графикой. В купе с Perl он даёт именно то, что нужно. Тут я немного приторможу на вопросе логичности использования Perl, так как вопрос этот не раз звучал в форуме. На моем хостинге нет возможности использовать готовые программы (convert, composite и т.д.), входящие в пакет ImageMagick, только именно поэтому приходится использовать Perl. Если вы обладаете такой возможностью, так вам и надо.
Не так давно обратил внимание на утилиту nconvert, которая входит в комплект xnview — просмотрщика картинок. Эта утилита также позволяет производить различные преобразования файлов, однако менее требовательна к установке и настройке. Об установке и свойствах утилиты можно прочитать здесь.
Используя вышеозначенные продукты, я написал небольшой класс для работы с изображениями.
Основные методы:
^images:save[image_file;destination_path;image_name;remove_meta;format]
- $image_file — значение, полученное из формы, с атрибутом, или объект класса file.
- $destination_path — путь, по которому будет сохранено изображение.
- $image_name — новое имя файла без расширения. В случае отсутствия этого параметра, файл будет сохранен с текущим именем.
- $remove_meta — значения 1/0. Удаляет мета-данные EXIF, IPTC и т.д. (при удалении происходит перекомпрессия файла 80%). Для этой функции необходим nConvert.
- $format — формат файла в который нужно сохранить изображение [gif|jpg|jpeg|jpe|png].
Сохраняет картинку в каталог $destination_path с именем $image_name в формате $format, попутно проверяя является ли картинка валидным файлом. Если не задан путь, картинка сохраняется в корневом каталоге (/). Если не указано имя файла или формат, картинка сохраняется с текущими значениями.
^images:resize[params]
- $.source_path — путь, где лежит большое изображение.
- $.destination_path — путь, по которому будет сохранено уменьшенное (preview) изображение. В случае отсутствия этого параметра, уменьшенное изображение перезапишется вместо исходного.
- $.image_name — имя исходного файла.
- $.x_size — ширина, до которой нужно уменьшить исходное изображение.
- $.y_size — высота, до которой нужно уменьшить исходное изображение.
- $.quality — качество сжатия jpg и png файлов в процентах от 1 до 100.
Изменяет размер исходной картинки по ширине и высоте, и сохраняет в текущем формате. Если задан только один линейный размер, второй подгоняется пропорционально. Результат сохраняется в каталог $destination_path с именем $image_name. Если не указан путь $source_path, картинка берётся из корневого каталога (/). Если не указан путь $destination_path, картинка сохраняется в $source_path. Можно осуществлять как уменьшение, так и увеличение картинки.
Пример использования:
Задача: сохранить большую картинку 12345.gif (500×500 px, в формат jpg, с качеством сжатия 80%, с именем файла 54321.jpg) в папку /big/, а маленькую картинку (100×120 px) в папку /small/.
@USE
images.p
...
$source_path[/big/]
$destination_path[/small/]
$extension[^file:justext[$form:pict.name]]
$image_name[54321.$extension]
$format[jpg]
^if(!^images:save[$form:picture;$source_path;$image_name;0;$format]){
^if(^extension.lower[] ne ^format.lower[]){
$image_name[${image_name}.$format]
}
$status[^images:resize[
$.source_path[$source_path]
$.destination_path[$destination_path]
$.image_name[$image_name]
$.x_size(100)
$.y_size(120)
$.quality[80]
]]
^if(!$status){
^rem{ *** Всё ок *** }
}{
^rem{ *** Возникла ошибка *** }
$status
}
}
Часто возникающие ошибки:
- Если вы хотите воспользоваться примером, проверьте, установлен ли Perl на вашем хостинге или локальной машине, так же проверьте наличие библиотеки ImageMagick без которой пример работать не будет.
- В случае если у вас Perl находится в папке отличной от #!/usr/bin/perl, не забудьте исправить этот путь.
- Если вы его исправили, не забудьте избавиться в Perl-скриптах от виндовых переводов строк.
- Правильно указывайте пути к файлу скрипта, в моем случае путь выглядит так /../cgi-bin, в вашем случае может быть что угодно.
- Не забудьте назначить для *.pl скриптов права на запуск.
- Проверяйте наличие enctype="multipart/form-data", без этого атрибута вы не сможете передать файлы через форму, и не забывайте в качестве метода передачи данных использовать POST.
- Указывайте в теге <form> атрибут action="путь_к_файлу". В IIS его отсутствие может привести к ошибке (комментарий Misha v.3).
Скачать:
images.zip
(11.07.2008
2,9 КБ)
Класс images.p