使用 GD 调整图像大小问题

Posted

技术标签:

【中文标题】使用 GD 调整图像大小问题【英文标题】:Image resize issue using GD 【发布时间】:2012-02-12 23:38:30 【问题描述】:

我已使用 GD 库成功调整图像大小。我将任何图像的大小调整为 350 x 250,问题是某些图片在调整大小时看起来不太好(拉伸),因为我将它们调整为固定大小。我有一个 350 x 250 的空间,需要调整图片大小,只要不拉伸,我不介意图片大小是否小于 350 x 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) ;

【问题讨论】:

您似乎没有使用计算出的变量(不同,x,y)。您需要根据您的计算传递 imagecopy 计算的比例大小和偏移量,以避免拉伸 知道了……完全错过了。现在一切都说得通了 【参考方案1】:

尝试使用我前段时间写的这个函数:

    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() 将 $resized 存储在磁盘上。

【讨论】:

你的数学看起来很眼熟,我想这就是我所做的。您的代码引用了 $this,但在图像上下文之外进行了演示。这可能会使读者感到困惑。 是的,但我不记得我在哪里找到了这个比例数学。可能也在***上......我很抱歉“$this”错误......我已经从我的Image类中提取了它......现在它已修复。 非常感谢 Wulf... 我只想问一件事,如果我不拉伸,图片的大小将始终为 350 x 250 或有时更小,具体取决于原图尺寸? 有时它会小于那个......它会尽量保持纵横比以避免扭曲整个图像并将其变成一团糟;)。例如:700x500 的图像会将其缩小为 350x250,因为比例相等。但是,如果尝试调整 800x500 的图像大小,它会将其缩小到 350x218 并居中。它会尝试使图像适合您的边界框。

以上是关于使用 GD 调整图像大小问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 GD 调整图像大小

使用 PHP GD 调整图像大小并保存图像。这段代码有啥问题?

使用gd在php中调整图像大小后的黑色背景

仅显示图像的某些部分并使用 GD 调整其大小

如何使用 GD 调整上传图像的大小并将其转换为 PNG?

PHP GD - 调整图像框架/画布的大小,但不是实际图像