Ads 468x60px

четверг, 21 июня 2012 г.

Perl изменение размера изображений.

После реализации задачи получения почтовых вложений, возникла новая: с целью экономии места на диске, корректировать большие картинки до приемлемых размеров. Использовать по прежнему будем perl.
Подготовка.
Для работы с изображениями в perl будем использовать модуль Image::Magick. В Debian его установка следующая:
$ sudo aptitude install perlmagick
Perl скрипт.
Представлен скрипт обрабатывающий изображения в заданной директории:
#!/usr/bin/perl
#crop.pl
use warnings;
use strict;
use Image::Magick;

my $imgDir = 'img';
my $imgPrefix = 'crop_'; # приставка к изображениям которым меняем размер
my $imgMax = 1000; # допустимая величина большей стороны картинки в пикселях
chdir $imgDir;
    opendir(DIR,'./') or die "Can't current dir: $!";
    while ( defined (my $file = readdir DIR) ) {
        # обрабатываем только файлы изображений
        # на данный момент только два формата
        next if not $file =~ /.+(\.jpg|\.png)/i;
        my $image = Image::Magick->new;
        $image->Read($file);
        #определяем ширину и высоту изображения
        my ($w,$h)=$image->Get('base-columns','base-rows');
        # переменные для вычисления новых значений высоты и ширины
        my ($nw,$nh);
        # изменять размер будем только, если одна из сторон больше нормы
        # выбираем большую сторону и сравниваем ее с нормой
        if ($w > $h) {
            next if $w <= $imgMax;
            $nh = int(($h/$w)*$imgMax); #вычисляем высоту, при большей ширине
            $nw = $imgMax;
            $image->Resize( width=>$nw, height=>$nh); #Делаем resize (изменения размера)
            $image->Write($imgPrefix.$file);#Сохраняем изображение.
            unlink($file);# удаляем исоходный файл
        } else {
            next if $h <= $imgMax;
            $nw = int(($w/$h)*$imgMax); #вычисляем ширину, при большей высоте
            $nh = $imgMax;
            $image->Resize( width=>$nw, height=>$nh); #Делаем resize (изменения размера)
            $image->Write($imgPrefix.$file);#Сохраняем изображение.
            unlink($file);# удаляем исоходный файл
        }
    }
exit 0;

Комментариев нет: