вернуться к примеру
Изменение размера картинок
лаборатория тестов

Я долго бился, как наверно и многие, над тем, чтобы научиться делать превью (маленькие изображения) для картинок. Ведь это бы дало возможность создавать с помощью Parser фото галереи, размещать картинки в новостях и т.д. Мне нужен был универсальный инструмент, который бы не цеплялся к формату файла (jpg, gif, png), умел производить различные манипуляции с изображениями и был способен выдавать адекватный, предсказуемый результат.

Такой инструмент называется ImageMagick, одна из самых мощных библиотек работы с графикой. В купе с Perl он даёт именно то, что нужно. Тут я немного приторможу на вопросе логичности использования Perl, так как вопрос этот не раз звучал в форуме. На моем хостинге нет возможности использовать готовые программы (convert, composite и т.д.), входящие в пакет ImageMagick, только именно поэтому приходится использовать Perl. Если вы обладаете такой возможностью, так вам и надо.

Не так давно обратил внимание на утилиту nconvert, которая входит в комплект xnview — просмотрщика картинок. Эта утилита также позволяет производить различные преобразования файлов, однако менее требовательна к установке и настройке. Об установке и свойствах утилиты можно прочитать здесь.

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

Основные методы:

^images:save[image_file;destination_path;image_name;remove_meta;format]

Сохраняет картинку в каталог $destinamtion_path с именем $image_name в формате $format, попутно проверяя является ли картинка валидным файлом. Если не задан путь, картинка сохраняется в корневом каталоге (/). Если не указано имя файла или формат, картинка сохраняется с текущими значениями.

^images:resize[params]

Изменяет размер исходной картинки по ширине и высоте, и сохраняет в текущем формате. Если задан только один линейный размер, второй подгоняется пропорционально. Результат сохраняется в каталог $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
	}
}

Часто возникающие ошибки

  1. Если вы хотите воспользоваться примером, проверьте, установлен ли Perl на вашем хостинге или локальной машине, так же проверьте наличие библиотеки ImageMagick без которой пример работать не будет.
  2. В случае если у вас Perl находится в папке отличной от #!/usr/bin/perl, не забудьте исправить этот путь.
  3. Если вы его исправили, не забудьте избавиться в Perl-скриптах от виндовых переводов строк.
  4. Правильно указывайте пути к файлу скрипта, в моем случае путь выглядит так /../cgi-bin, в вашем случае может быть что угодно.
  5. Не забудьте назначить для *.pl скриптов права на запуск.
  6. Проверяйте наличие enctype="multipart/form-data", без этого атрибута вы не сможете передать файлы через форму, и не забывайте в качестве метода передачи данных использовать POST.
  7. Указывайте в теге <form> атрибут action="путь_к_файлу". В IIS его отсутствие может привести к ошибке (комментарий Misha v.3).
images.zip (30 августа 2018 г., 2.9 Кб)

класс images.p

Powered by Parser 3 Eugene Spearance