The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Perl" / Оглавление документа

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

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


Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру