Проблема с изменением размера изображения с помощью GD


Я успешно изменил размер изображений с помощью библиотеки GD. Я изменяю размер любого изображения до 350 x 250, проблема в том, что некоторые изображения выглядят не очень хорошо (растягиваются) при изменении их размера, так как я изменяю их размер до фиксированного. У меня есть пространство размером 350 х 250, где необходимо изменить размер изображения, я не возражаю, если размер изображения меньше 350 х 250, если оно не растягивается. Как мне решить эту проблему?

                      $save = "$directory/" . $file_name; //This is the new file you saving
                      $file = "$directory/" . $file_name; //This is the original file

                      list($width, $height) = getimagesize($file) ; 
                      $modwidth = 350; 
                      if ($width > $height) {
                      $y = 0;
                      $x = ($width - $height) / 2;
                      $smallestSide = $height;
                    } else {
                      $x = 0;
                      $y = ($height - $width) / 2;
                      $smallestSide = $width;
                    }

                      $diff = $width / $modwidth;

                      $modheight = 250; 
                      $tn = imagecreatetruecolor($modwidth, $modheight) ; 
                      $image = imagecreatefromjpeg($file) ; 
                      imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height);
                      imagejpeg($tn, $save, 100) ;
Author: zista, 2012-02-13

1 answers

Попробуйте использовать эту функцию, которую я написал некоторое время назад:

    public function resize($img, $width, $height, $stretch = false)
    {
        $temp = imagecreatetruecolor($width, $height);
        imagealphablending($temp, true);
        imagesavealpha($temp, true);

        $bg = imagecolorallocatealpha($temp, 0, 0, 0, 127); // Background color
        imagefill($temp, 0, 0, $bg);

        if ($stretch)
        {
            imagecopyresampled($temp, img, 0, 0, 0, 0, $width, $height, imagesx($img), imagesy($img)); 
        }
        else
        {          
            if (imagesx($img) <= $width && imagesy($img) <= $height)
            {
                $fwidth = imagesx($img);
                $fheight = imagesy($img);
            }
            else
            {
                $wscale = $width / imagesx($img);
                $hscale = $height / imagesy($img);
                $scale = min($wscale, $hscale);
                $fwidth = $scale * imagesx($img);
                $fheight = $scale * imagesy($img);
            }
            imagecopyresampled($temp,                             
                $img,                                      
                ($width - $fwidth) / 2, ($height - $fheight) / 2,   
                0, 0,                                              
                $fwidth, $fheight,                                 
                imagesx($img), imagesy($img)               
            );
        }
        return $temp; 
    }

Если вы скажете не растягивать изображение, оно рассчитает новый размер, чтобы он соответствовал вашему новому размеру.

Используйте его как:

...
$image = imagecreatefromjpeg($file);
$resized = resize($image, 350, 250, false); // false = don't stretch
imagejpeg($resized, $save, 100);
...

Теперь сохраните $с измененным размером на диске, например, с помощью imagepng().

 2
Author: WoLfulus, 2012-02-13 00:39:01