parser

Изменение размеров графических изображений внешними программами

Автор: [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