Forum Webscript.Ru
Программирование => Perl => Тема начата: Piter-G от 09 Января 2005, 18:00:56
-
из загружаемой пользователем картинки я делаю аватар путем ее уменьшения до размера 75 пикселей по длинной стороне. Другая сторона вычисляется.
my ($width, $height)=$image->Get(\'width\',\'height\');
$ratio=$height/$width;
if ($width>=$height){
$avatar_width=75;
$avatar_height=int($avatar_width*$ratio);
}
else{
$avatar_height=75;
$avatar_width=int($avatar_height/$ratio);
}
Потом ресайз. Все с помощью Image::Magick. Скрипт работает, и пользователи им успешно пользуются. Но иногда возникает проблема - картинка после ресайза становится расширенной, и изображение поганится. Причем это не зависит от ориентации исходной картинки - вертикальной или горизонтальной. В чем здесь может быть дело? Может ли это быть связано с каким-либо багом в Image::Magick, и если да, то с каким? Заранее благодарен за конструктивное обсуждение.
-
Piter-G, Попробуй залить 30*30. И подумай, почему
Piter-G:
картинка после ресайза становится расширенной, и изображение поганится
-
Glebushka, Вы имеете ввиду, что не обработан вариант, когда $width==$height? Но в этом случае их отношение равно 1, выполняется условие, и высота принимает значение 75, как и ширина.
А может, Вы имеете ввиду, что картинка должна расшириться, если исходный ее размер меньше 75? Но, может я неправильно выразился. Какртинка в некоторых случаях увеличивается в размерах непропорционально, а именно, ширина больше, чем должна была бы быть, и картинка выглядит "растянутой".
-
Кроме того, пользователи всегда грузят изображения больше чем 75х75 - в основном электронные или отсканированные фотографии себя, любимых.
-
Я делаю ресайз изображений до 100х120 или <100х<120 так:
$f="серверный путь к файлу";
#Изменение размера фотографий
my($image, $x); #переменные
$image = Image::Magick->new; #новый проект
$x = $image->Read("$f"); #открываем файл
($ox,$oy)=$image->Get(\'base-columns\',\'base-rows\'); #определяем ширину и высоту изображения
#Вычисляем и сохраняем маленькую картинку
$nx=int(($oy/$ox)*100); #вычисляем
$image->Resize(geometry=>geometry, width=>100, height=>$nx); #Делаем resize (изменения размера)
if($nx>120)
{
#Если высота получилась больше 120
$image->Crop(x=>0, y=>0); #Задаем откуда будем резать
$image->Crop(\'100x120\'); #С того места вырезаем 100х120
}
$x = $image->Write("$smallf"); #Сохраняем изображение.
-
2Kwazar:
Спасибо. Кстати - а если обрежется важный кусок картинки? Мне кажется, что так, как поступаю я, более правильно, хотя это и не имХО.
-
http://search.cpan.org/~lgoddard/Image-Magick-Thumbnail-0.02/Thumbnail.pm
?
-
Piter-G
У меня, кстати это работает до сих пор, нового почти ничего не писал:
http://www.webscript.ru/stories/03/12/04/7116346
#Теперь уменьшаем изображение:
$image = Image::Magick->new;
$image->Read("$file"); # $file - понятно что это только что загруженный файл
#Разберемся с тем какой размер иконки должен быть:
my ($ox, $oy, $oc, $ic, $nx, $ny, $geo);
($ox,$oy)=$image->Get(\'columns\',\'height\');
if (($ox > $ix)||($oy > $iy)) {
$oc = $ox/$oy; $ic = $ix/$iy;
if ($oc < $ic) {$ny = $iy; $nx=int(($ox/$oy)*$iy);}
elsif ($oc > $ic) {$nx = $ix; $ny=int(($oy/$ox)*$ix);}
else {$nx = $ix; $ny = $iy;}}
else {$nx=$ox;$ny=$oy;}
#Изменяем размер и сохраняем изображение:
$geo = \'geometry\';
$image->Resize(geometry=>$geo, width=>$nx, height=>$ny);
$file = $path_image."i".$tv[1].".".$tv[0];
$image -> Write("$file");
Хотя нет, вот тебе готовые процедуры:
Ресайз:
sub WM4_resize_image {
my $file_input = shift; my $file_output = shift; my $ix = shift; my $iy = shift;
my $image = Image::Magick->new; $image->Read("$file_input");
(my $ox, my $oy) = $image -> Get(\'columns\',\'height\'); my ($nx, $ny);
if (($ox > $ix)||($oy > $iy)) {
my $oc = $ox/$oy; my $ic = $ix/$iy;
if ($oc < $ic) {$ny = $iy; $nx=int(($ox/$oy)*$iy)} elsif ($oc > $ic) {$nx = $ix; $ny=int(($oy/$ox)*$ix)} else {$nx = $ix; $ny = $iy}
} else {$nx = $ox; $ny = $oy}
my $geo = \'geometry\';
if ($ox eq $nx && $oy eq $ny) {$image->Write("$file_output")}
else {$image->Resize(geometry=>$geo, width=>$nx, height=>$ny);$image->Write("$file_output")}
chmod oct($$site_vars{\'chmod_img\'}), $file_output;
return \'true\';
}
Обрезка:
sub WM4_crop_image {
my $file_input = shift; my $file_output = shift; my $ix = shift; my $iy = shift;
my $image = Image::Magick->new; $image->Read("$file_input");
(my $ox, my $oy) = $image -> Get(\'columns\',\'height\'); my ($nx, $ny); my $geo = \'geometry\';
if (($ox > $ix)||($oy > $iy)) {
my $oc = $ox/$oy; my $ic = $ix/$iy;
if ($oc > $ic) {$ny = $iy; $nx=int(($ox/$oy)*$iy)} elsif ($oc < $ic) {$nx = $ix; $ny=int(($oy/$ox)*$ix)} else {$nx = $ix; $ny = $iy}
} else {$nx = $ox; $ny = $oy}
$image->Resize(geometry=>$geo, width=>$nx, height=>$ny);
my ($sx,$sy);
if ($nx > $ix && $ny eq $iy) {$sy = 0; $sx = int(($nx - $ix)/2)}
elsif ($nx eq $ix && $ny > $iy) {$sy = int(($ny - $iy)/2); $sx = 0}
else {$sy = 0; $sx = 0}
$image->Crop(geometry=>$geo, width=>$ix, height=>$iy, \'x\'=>$sx, \'y\'=>$sy);
$image->Write("$file_output");
chmod oct($$site_vars{\'chmod_img\'}), $file_output;
return \'true\';
}
Добавление полей
sub WM4_canvize_image {
my $file_input = shift; my $file_output = shift; my $ix = shift; my $iy = shift;
my $fill = shift; $fill = \'#FFFFFF\' if !$fill;
my $image = Image::Magick->new; $image->Read("$file_input");
(my $ox, my $oy) = $image -> Get(\'columns\',\'height\'); my ($nx, $ny); my $geo = \'geometry\';
if (($ox > $ix)||($oy > $iy)) {
my $oc = $ox/$oy; my $ic = $ix/$iy;
if ($oc < $ic) {$ny = $iy; $nx=int(($ox/$oy)*$iy)} elsif ($oc > $ic) {$nx = $ix; $ny=int(($oy/$ox)*$ix)} else {$nx = $ix; $ny = $iy}
} else {$nx = $ox; $ny = $oy}
my ($sx,$sy);
if ($nx < $ix && $ny eq $iy) {$sy = 0; $sx = int(($ix - $nx)/2)}
elsif ($nx eq $ix && $ny < $iy) {$sy = int(($iy - $ny)/2); $sx = 0}
else {$sy = 0; $sx = 0}
if ($sx*2 < ($ix - $nx)) {$nx = $ix - $sx*2}
if ($sy*2 < ($iy - $ny)) {$ny = $iy - $sy*2}
$image->Resize(geometry=>$geo, width=>$nx, height=>$ny);
$image->Border(geometry=>$geo, width=>$sx, height=>$sy, fill=>$fill);
$image->Write("$file_output");
chmod oct($$site_vars{\'chmod_img\'}), $file_output;
return \'true\';
}
Надеюсь расписано все понятно...
-
Phoinix:
Надеюсь расписано все понятно...
Более чем! Спасибо, Вы очень мне помогли!