Размытое уменьшение размера 400 x 400 до 300 x 300

Хорошо, вот проблема, jpeg 400x400 выглядит нормально, качество отличное. Однако при изменении размера до 300 x 300 создается впечатление, что его разобрал и снова собрал двухлетний ребенок.

вот сценарий

$image->resize(300,300);

который вызывает следующий скрипт

 function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }   

изображение загружено для изменения размера.

введите здесь описание изображения

Вот класс изображения

class SimpleImage {

   var $image;
   var $image_type;

   function load($filename) {

      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {

         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {

         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {

         $this->image = imagecreatefrompng($filename);
      }
   }

   function save($filename, $image_type=IMAGETYPE_JPEG, $compression=99, $permissions=null) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {
         imagegif($this->image,$filename);
      } elseif( $image_type == IMAGETYPE_PNG ) {
         imagepng($this->image,$filename);
      }


      if( $permissions != null) {

        chmod($filename,$permissions);
      }
   }
   function output($image_type=IMAGETYPE_JPEG) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image);
      }
   }

    function getWidth() {

      return imagesx($this->image);
   }
   function getHeight() {

      return imagesy($this->image);
   }
   function resizeToHeight($height) {

      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }

  function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }   

}

person RussellHarrower    schedule 10.07.2014    source источник
comment
Хороший вопрос, но я чувствую, что заголовок можно сделать более конкретным.   -  person Jon    schedule 10.07.2014
comment
@Джон, как бы это назвать   -  person RussellHarrower    schedule 10.07.2014
comment
возможный дубликат низкое качество php imagecopyresampled   -  person Theolodis    schedule 10.07.2014
comment
отсутствует шаг вывода - это imagejpeg? И проблема в том, что предлагает @Theolodis?   -  person Alister Bulman    schedule 10.07.2014
comment
@AlisterBulman проблема с сжатием jpeg в основном связана с jpeg (алгоритмом) и качеством jpeg.   -  person Theolodis    schedule 10.07.2014
comment
Только что попробовал ваш код, но напрямую использовал подпрограммы GD. Качество хорошее. хотя GD не так мощен, как ImageMagik, он прекрасно справляется со своей задачей.   -  person Ryan Vincent    schedule 10.07.2014


Ответы (2)


Чтобы проверить вашу функцию, мне пришлось реализовать остальную часть класса. Это работает для меня на PHP 5.5.14. Ваш код включен сюда без изменений:

class image
{
    public $image = null;

    public function __construct($img)
    {
        $this->image = imagecreatefromjpeg($img);
    }

    public function resize($width,$height) {
        $new_image = imagecreatetruecolor($width, $height);
        imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
        $this->image = $new_image;
    }

    public function getWidth()
    {
        return imagesx($this->image);
    }

    public function getHeight()
    {
        return imagesy($this->image);
    }
}

$image = new image('img.jpg');

$image->resize(300,300);

header('Content-Type: image/jpeg');
imagejpeg($image->image);
exit;

Это дает мне следующий вывод, который немного размыт, но намного лучше, чем ваш пример.

введите здесь описание изображения

person timclutton    schedule 10.07.2014
comment
Я нашел свою проблему - это был тот факт, что я увеличил размер изображения 80x80, а затем снова увеличил его до 300x300 по моей вине. - person RussellHarrower; 10.07.2014

На самом деле это не ответ, а просто помощь, и я не могу размещать фотографии в комментариях...

Если вам интересно, стоит ли устанавливать и использовать ImageMagick, я сделал это для вас ниже:

convert in.jpg -resize 300x300 out.jpg

введите здесь описание изображения

person Mark Setchell    schedule 10.07.2014
comment
Как бы я использовал это в PHP и является ли ImageMagick установкой Yum - похоже, вы дали мне команду терминала - person RussellHarrower; 10.07.2014