Автор Тема: Неправильный ресайз картинки. Image::Magick - здесь ли проблема?  (Прочитано 5189 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Piter-G

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://skitalets.ru
из загружаемой пользователем картинки я делаю аватар путем ее уменьшения до размера 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, и если да, то с каким? Заранее благодарен за конструктивное обсуждение.

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
Piter-G, Попробуй залить 30*30. И подумай, почему
Цитировать
Piter-G:
картинка после ресайза становится расширенной, и изображение поганится
Ну к чему все это, лучше бы водки выпили...

Оффлайн Piter-G

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://skitalets.ru
Glebushka, Вы имеете ввиду, что не обработан вариант, когда $width==$height? Но в этом случае их отношение равно 1, выполняется условие, и высота принимает значение 75, как и ширина.
 
А может, Вы имеете ввиду, что картинка должна расшириться, если исходный ее размер меньше 75? Но, может я неправильно выразился. Какртинка в некоторых случаях увеличивается в размерах непропорционально, а именно, ширина больше, чем должна была бы быть, и картинка выглядит "растянутой".

Оффлайн Piter-G

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://skitalets.ru
Кроме того, пользователи всегда грузят изображения больше чем 75х75 - в основном электронные или отсканированные фотографии себя, любимых.

Оффлайн Kwazar

  • Философ
  • Постоялец
  • ***
  • Сообщений: 201
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.uhuhu.ru/
Я делаю ресайз изображений до 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"); #Сохраняем изображение.
« Последнее редактирование: 13 Января 2005, 12:16:08 от Kwazar »
С уважением Сергей

Оффлайн Piter-G

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://skitalets.ru
2Kwazar:

Спасибо. Кстати - а если обрежется важный кусок картинки? Мне кажется, что так, как поступаю я, более правильно, хотя это и не имХО.

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
There Is More Than One Way To Do It (c)

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
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 shiftmy $file_output shiftmy $ix shiftmy $iy shift;
     
my $image Image::Magick->new$image->Read("$file_input");
     (
my $oxmy $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 shiftmy $file_output shiftmy $ix shiftmy $iy shift;
     
my $image Image::Magick->new$image->Read("$file_input");
     (
my $oxmy $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 shiftmy $file_output shiftmy $ix shiftmy $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\';
}


Надеюсь расписано все понятно...

Оффлайн Piter-G

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://skitalets.ru
Цитировать
Phoinix:
Надеюсь расписано все понятно...


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

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28