За последние 24 часа нас посетили 20439 программистов и 1643 робота. Сейчас ищут 1572 программиста ...

качество в GD2 (Resize)

Тема в разделе "Обработка изображений средствами PHP", создана пользователем gkhelloworld, 6 июн 2010.

  1. gkhelloworld

    gkhelloworld Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    немного зная gd2 написал класс который обрабатывает изображение...
    как-то не обратил внимание, что resize он делает как-то похабно...
    вот пример

    [​IMG]

    мне кажется, что я не ту функцию использовал для ресайзинга.. можете подсказать какую нужно использовать в данном случае

    отрывок из класса..функция которая резайзит img

    PHP:
    1.  
    2. <?php
    3. function re_resize($filename = '',$filename_out = '')
    4. {
    5. $file = $this->re_file($filename);
    6. if (is_object($file))
    7. {
    8. if ($file->width >= $this->resize_w && $file->height >= $this->resize_h)
    9. {
    10. if ($file->width > $file->height)
    11. {
    12. $var_w = $this->resize_w;
    13. $var_h = $file->height/($file->width/$this->resize_w);
    14. }
    15. else if ($file->width == $file->height)
    16. {
    17.     if ($this->resize_w > $this->resize_h)
    18.     {
    19. $var_w = $this->resize_w;
    20. $var_h = $file->height/($file->width/$this->resize_w);
    21.     }
    22.     else if ($this->resize_w < $this->resize_h)
    23.     {
    24.     $var_w = $file->width/($file->height/$this->resize_h);
    25.     $var_h = $this->resize_h;
    26.     }
    27.     else if ($this->resize_w == $this->resize_h)
    28.     {
    29.         $var_w = $this->resize_w;
    30.         $var_h = $this->resize_h;
    31.     }
    32. }
    33. else
    34. {
    35. $var_h = $this->resize_h;
    36. $var_w = $file->width/($file->height/$this->resize_h);
    37. }
    38. $thumb = imagecreatetruecolor($var_w, $var_h);
    39. imagecopyresized($thumb, $file->source, 0, 0, 0, 0, $var_w, $var_h, $file->width, $file->height);
    40.  
    41. if ($this->watermark != FALSE)
    42. {
    43. if (@exif_imagetype($this->watermark) == 3)
    44. {
    45. $offset = 5;
    46. // Only PNG
    47.     $r = imagecreatefrompng($this->watermark);
    48.     $x = imagesx($r);
    49.     $y = imagesy($r);
    50.  
    51.     $xDest = $var_w - ($x + $offset);
    52.     $yDest = $var_h - ($y + $offset);
    53.     imageAlphaBlending($thumb,1);
    54.     imageAlphaBlending($r,1);
    55.     imagesavealpha($thumb,1);
    56.     imagesavealpha($r,1);
    57.     imagecopyresampled($thumb,$r,$xDest,$yDest,0,0,$x,$y,$x,$y);
    58.    
    59.  
    60.  
    61.     imagedestroy($r);
    62.  
    63. }
    64. }
    65.  
    66. imagejpeg($thumb, $filename_out, $this->quality);
    67. imagedestroy($thumb);
    68.  
    69.  
    70. }
    71. else
    72. {
    73. // Изображение не соответствует нужным размерам
    74. return $this->re_report_errors(3);
    75. }
    76. }
    77. }
    78. ?>
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    клади сюда класс) интересно, я тоже хотел свой писать)
    зы: в php теги заключи и <? сверху добавь
     
  3. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    ммм у вас сначала imagecopyresized, потом imagecopyresampled, где то тут была тема что это быстрее в 4 раза но ухудшается качество,
    сколько тут $this->quality ?
     
  4. gkhelloworld

    gkhelloworld Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    q = 100
    ну это уже видно... ну мне не скорость главное.. у меня загрузка картинок идет по одной при таком варианте, я думаю лучше качество улучшить... дело в том что класс я делал на скорую руку не было времени играться...
    если поможете с фиксом отошлю вам весь класс :D
     
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    в этой книжке полностью класс реализован...
    рекомендую еше вот это хотябы первую главу, там описано как правильно делать отступы,расставлять скобки, комментировать и называть переменные, тяжеловато ваш код читать
     
  6. gkhelloworld

    gkhelloworld Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    часть с imagecopyresampled($thumb,$r,$xDest,$yDest,0,0,$x,$y,$x,$y); это накладка ватер марка..кстати..
    при создании этой картинки


    [​IMG]

    я использовал параметр watermark == FALSE т.е. imagecopyresampled не использовал
     
  7. gkhelloworld

    gkhelloworld Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    насчет моего написания.. это да...спасибо..прочту непременно, потому что я сам иногда запутываюсь
     
  8. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    ну, у меня вот такой ресайз пока стоит...
    PHP:
    1. <?
    2. $path='';
    3. $handle = imagecreatefromjpeg($path);
    4. $width = imagesx($handle);
    5. $height = imagesy($handle);
    6.   if ($width > 250){
    7.     $new_width = 250;
    8.     $new_height = $height * ($new_width/$width);
    9.     $resized = imagecreatetruecolor($new_width, $new_height);
    10.     imagecopyresampled($resized, $handle, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    11.     imagejpeg($resized, $path, 60);
    12.   }
    вроде норм, только у меня без вотермарка
     
  9. gkhelloworld

    gkhelloworld Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    кажись я понял...
    imagecopyresized -просто уменьшает
    imagecopyresampled - уменьшает с сглаживанием типа ..вот поэтому magecopyresized быстрее он как браузер уменьшил и всё )
     
  10. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    в жизни бы не догадался что у вас imagecopyresampled не отрабатывает)
     
  11. gkhelloworld

    gkhelloworld Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    блин это же очевидно.. елки палки )) по моему я сегодня переработал..
    Padaboo мой класс делает
    Кроп определенному размеру как вконтакте
    Рекроп - если картинка широкая или высокая он вырезает правильный момент и делаем фиксорованый размер например вам нужно чтобы рисунок 400 на 600 был 100 на 100 - и ресайзит и вырезает
    Ресайз - это вы уже знаете
    Конфиги загружаются через массив =)
    если нужен класс кричите в личку скину
     
  12. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    неее, так не интересно) самому интереснее написать)
    книжки могу залить если интересно ммм.. я вот думаю копирование в нужную папку и генерацию имени в этот же класс пихать или расширять его или просто отдельной функцией
     
  13. gkhelloworld

    gkhelloworld Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    Padaboo
    100%, та я сам запутался в том, что писал, надо срочно прочитать книгу..как раз у меня она есть недавно достал..только вот почитать нет времени =) завтра + 2 ч на чтение :D

    согласен, поэтому я сам и написал, кстати этой мой первый класс :D
     
  14. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    хммм это как, я думал через __construct при инициализации объекта делать
    зы: мой первый класс был с 1м методом и все что он делал выводил в консоль "еб*ный питон" :D
     
  15. gkhelloworld

    gkhelloworld Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    ну мой первый класс тоже был привет мир ) я имел ввиду первый класс который помог мне ) и которым я пользуюсь
    загрузка конфигов я взял идею с CodeIgniter

    PHP:
    1.  
    2. <?php
    3.  
    4.     function initialize($config = array())
    5.     {
    6.         $defaults = array(
    7.             'resize_w'          => 100,
    8.             'resize_h'          => 100,
    9.             'cropsize_w'        => 100,
    10.             'cropsize_h'        => 100,
    11.             'crop_w'            => 100,
    12.             'crop_h'            => 100,
    13.             'watermark'         => FALSE,
    14.             'quality'           => 75
    15.                         ); 
    16.    
    17.         foreach ($defaults as $key => $val)
    18.         {
    19.             if (isset($config[$key]))
    20.             {
    21.                 $method = 'set_'.$key;
    22.                 if (method_exists($this, $method))
    23.                 {
    24.                     $this->$method($config[$key]);
    25.                 }
    26.                 else
    27.                 {
    28.                     $this->$key = $config[$key];
    29.                 }          
    30.             }
    31.             else
    32.             {
    33.                 $this->$key = $val;
    34.             }
    35.         }
    36.     }
    37. ?>