Forum Webscript.Ru

Программирование => Perl => Тема начата: Piter-G от 09 Января 2005, 18:00:56

Название: Неправильный ресайз картинки. Image::Magick - здесь ли проблема?
Отправлено: 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, и если да, то с каким? Заранее благодарен за конструктивное обсуждение.
Название: Неправильный ресайз картинки. Image::Magick - здесь ли проблема?
Отправлено: glebushka от 09 Января 2005, 18:19:56
Piter-G, Попробуй залить 30*30. И подумай, почему
Цитировать
Piter-G:
картинка после ресайза становится расширенной, и изображение поганится
Название: Неправильный ресайз картинки. Image::Magick - здесь ли проблема?
Отправлено: Piter-G от 09 Января 2005, 18:32:51
Glebushka, Вы имеете ввиду, что не обработан вариант, когда $width==$height? Но в этом случае их отношение равно 1, выполняется условие, и высота принимает значение 75, как и ширина.
 
А может, Вы имеете ввиду, что картинка должна расшириться, если исходный ее размер меньше 75? Но, может я неправильно выразился. Какртинка в некоторых случаях увеличивается в размерах непропорционально, а именно, ширина больше, чем должна была бы быть, и картинка выглядит "растянутой".
Название: Неправильный ресайз картинки. Image::Magick - здесь ли проблема?
Отправлено: Piter-G от 09 Января 2005, 18:34:30
Кроме того, пользователи всегда грузят изображения больше чем 75х75 - в основном электронные или отсканированные фотографии себя, любимых.
Название: Неправильный ресайз картинки. Image::Magick - здесь ли проблема?
Отправлено: Kwazar от 13 Января 2005, 12:10:45
Я делаю ресайз изображений до 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"); #Сохраняем изображение.
Название: Неправильный ресайз картинки. Image::Magick - здесь ли проблема?
Отправлено: Piter-G от 13 Января 2005, 18:39:27
2Kwazar:

Спасибо. Кстати - а если обрежется важный кусок картинки? Мне кажется, что так, как поступаю я, более правильно, хотя это и не имХО.
Название: Неправильный ресайз картинки. Image::Magick - здесь ли проблема?
Отправлено: 2NetFly от 15 Января 2005, 00:19:25
http://search.cpan.org/~lgoddard/Image-Magick-Thumbnail-0.02/Thumbnail.pm

?
Название: Неправильный ресайз картинки. Image::Magick - здесь ли проблема?
Отправлено: Phoinix от 15 Января 2005, 13:59:13
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\';
}

Надеюсь расписано все понятно...
Название: Неправильный ресайз картинки. Image::Magick - здесь ли проблема?
Отправлено: Piter-G от 15 Января 2005, 14:15:41
Цитировать
Phoinix:
Надеюсь расписано все понятно...


Более чем! Спасибо, Вы очень мне помогли!