Содание маленьких картинок для галереи.

Допустим у Вас есть 100000 картинок, ну или около того. Все они различного размера, могут быть и 1000х1000 и 200х234. Необходимо получить маленьких 100000 картинок, высотой 60 пикселов и соответствующей шириной. Это можно сделать при помощи модуля use Image::Magick Скачиваем модуль PerlMagick-*.*.*.tar.gz . Проделываем стандартную распаковку модуля: gunzip -c PerlMagick-5.39.tar.gz | tar -xvf - затем устанавливаем его cd PerlMagick perl Makefile.PL make make test make install И пишем следующий скрипт: #!/usr/bin/perl -w use lib '/usr/local/etc/httpd/bin/devel/IS'; use Image::Size; use Image::Magick; my $tumb="/usr/local/etc/httpd/images"; my $dir="/usr/local/etc/httpd/devel/pics"; my $vis=60; #высота картинки while(<$tumb/*.*>){ $_="aaa.gif" unless /\.(gif|jpg|jpeg|png)/i; $uu=$_; $uu=~s!.*/!!; print "$uu\t=>\tmini_$uu\n"; my($image, $x); $image = Image::Magick->new; my ($w, $h) = imgsize($_); my $t=int($w/($h/$vis)) if $h/$vis != 0; $x = $image->Read($_); warn "$x" if "$x"; $x = $image->Resize(geometry=>'100x100"+1"00"+1"00', width=>$t, height=>$vis); warn "$x" if "$x"; $_=~s!.*/!!; $x = $image->Write("$dir/mini_$_"); warn "$x" if "$x"; }

Циклом while(<$tumb/*.*>){to do} просматриваем содержимое директории с картинками. При помощи модуля Image::Size устанавливаем размеры исходной картинки. В переменной $vis=60; определяем высоту маленькой картинки на выходе. Строчкой my ($w, $h) = imgsize($_); берем реальные размеры картинки и, чтобы ширина картинки была пропорциональна высоте(ведь не известно, картинки какого размера лежат в директории), строчкой my $t=int($w/($h/$vis)) if $h/$vis != 0; масштабируем ширину. Логика проста, берем реальный размер картинки, делим на $vis, получаем коэффициент пропорциональности между размерами, т.е. допустим картинка, исходная, больше маленькой например в 2,34567 раз. Далее делим на этот коэффициент ширину картинки и получаем уменьшенную копию картинки высотой в $vis пикселов и соответствующей этой высоте ширине(как это автоматически делает, т.е. сохраняет пропорции, photoshop любой версии), далее берем целую часть от этогй высоты функцией int, условие if $h/$vis != 0 исключает деление на 0. Итак, в переменной $t содержится ширина картинки, вызываем функцию Resize, которй передаем два параметра, ширину и высоту и на выходе имеем маленькую картинку mini_pic.gif с названием отличным от большой pic.gif. Условие $_="aaa.gif" unless /\.(gif|jpg|jpeg|png)/i; предназначено для того, чтобы выделить из директории с файлами только файлы картинок. Скрипт просто перезаписывает одну и ту-же картинку. Хотя можно было бы и пропускать шаг цикла while.

Собственно вот и все.

Далее можно написать скрипт, выводящий маленькие картинки из директории, пользуясь тем-же модулем Image::Size, нужно только взглянуть на его документацию.