Допустим у Вас есть 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, нужно только взглянуть на его документацию.