Здесь я заюзал ещё и Image::Size, его можно установить сначала на свой локальный копмпьютер, а затем вручную создать на сервере каталог Image и скопировать в него каталог /Size и файл Size.pm из локального каталога библиотеки. Затем добавить в @INC путь к новой библиотеки, либо заюзать use lib (); Проверял лично, всё чудесно работатет.
| Код | #!/usr/bin/perl -w use strict; use Image::Size; use Image::Magick;
file_reparation("D:", "120x80", "tmpx.jpg", "small.jpg");
sub file_reparation { my($img_dir,$to_size,$original_file,$new_file) = @_;
# Узнаём ширину и высоту оригинала my( $width, $height ) = imgsize("$img_dir/$original_file");
# Если не удалось получить ширину и высоту оригинала, вернём false return 0 unless $width or $height;
# Создаём объект Image::Magick my $image = Image::Magick->new(); # Считываем оригинал my $img_obj = $image->Read("$img_dir/$original_file");
# Разбиваем полный размер на ширину и высоту до которых нужно изменить изображение my( $to_width, $to_height ) = split("x", $to_size);
# Вычисляем ширину если хотим уменьшить высоту до 200, это # необходимо для сохранения пропоций изображения. my $x_width = eval{ $width / $height * $to_height };
# Уменьшаем изображение $image->Resize( width => $x_width, height => $to_height );
# Если ширина получилась больше необходимой, то урезаем изображение. if ( $x_width > $to_width ) { # Вычисляем откуда нужно резать изображение my $x_cut = int( ( $x_width - $to_width ) / 2 ); # Задаём позицию, с которой будем резать изображение $image->Crop(x => $x_cut, y => 0); # Режем изображение $image->Crop( $to_size ); }
# Сохраняем изображение $image->Write("$img_dir/$new_file"); return 1; }
|
Подпрограмма получает 4 параметра: 1) Путь к каталогу где находится изображение. 2) Размер до которого нужно уменьшить изображение в формате "120x80" 3) Имя файла оригинала. 4) Имя нового файла.
У этого алгоритма сохранения пропорций, есть один недостаток. Если высота изображения больше ширины, то может получиться не совсем то, что нужно. Но это очень легко исправить, а у меня как-то руки не доходят до этого. ;(((((( Может кто-нить из вас возьмётся сделать это? Вот что я имею ввиду:
1) После того как мы узнали размер оригинала:
| Код | # Узнаём ширину и высоту оригинала my( $width, $height ) = imgsize("$img_dir/$original_file");
|
Было бы не плохо создать условие
| Код | if ( высота > ширины ) { # Вот здесь нужно сделать впринципе то же самое, но наоборот, сначала # вместо $x_width, поулить $x_height, т.е. взять за основу не ширину, а высоту # Это сделать дастаточно легко имея код выше. } else { # Здесь код как и прежде, сохраняем пропорции отталкиваясь от ширины }
|
Если например нам не нужен оригинал, то вызвать данную подпрограмму, можно так:
| Код | if ( file_reparation("D:", "120x80", "tmpx.jpg", "small.jpg") ) { unlink("D:/tmpx.jpg") or warn "Can't remove file: $!\n"; } else { warn "Can't resize file, because file is not image :(((\n"; }
|
Так же, внутрь подпрограммы, можно добавить ещё один параметр, путь к каталогу, в который нужно сохранять новое изображение. Зачастую так и нужно делать, очень редко нужно сохранять изображение в тот же каталог, где лежит оригинал.
Вобщем пробуйте. ;)))))) |