【问题标题】:Resizing and cropping image with GD while retaining aspect ratio在保持纵横比的同时使用 GD 调整和裁剪图像
【发布时间】:2011-11-11 06:27:38
【问题描述】:

我目前正在编写基于 Uploadify 的上传脚本。现在我调整给定图像的大小并为其中一种尺寸加水印。这一切都很好,但我需要脚本来调整高度,然后裁剪宽度,这样纵横比就不会被弄乱。

这是我目前的代码:

if ($fileExtension == "jpg" || 
        $fileExtension == "jpeg" || 
        $fileExtension == "png" || 
        $fileExtension == "gif"){

        // GD variables:
        list($width, $height, $type) = GetImageSize($uploadedFile['tmp_name']);

        // Image sizes:
        $bigImage = array(800, 453);
        $mediumImage = array(410, 231);
        $listImage = array(120, 68);
        $thumbnail = array(90, 51);

        $sourceAspect = $width / $height;
        $bigAspect = $bigImage[0] / $bigImage[1];
        $mediumAspect = $mediumImage[0] / $mediumImage[1];
        $listAspect = $listImage[0] / $listImage[1];
        $thumbnailAspect = $thumbnail[0] / $thumbnail[1];

        // Image is PNG:
        if ($type == IMAGETYPE_PNG){
            $image = imagecreatefrompng($uploadedFile['tmp_name']);
            $valid = true;
        }

        // Image is JPEG:
        else if ($type == IMAGETYPE_JPEG){
            $image = imagecreatefromjpeg($uploadedFile['tmp_name']);
            $valid = true;
        }

        // Image is GIF:
        else if ($type == IMAGETYPE_GIF){
            $image = imagecreatefromgif($uploadedFile['tmp_name']);
            $valid = true;
        }

        // Format not allowed:
        else {
            $valid = false;
        }

        // Start creating images:
        if ($valid){

            // Get size:
            $imageSize = getimagesize($uploadedFile['tmp_name']);

            // Generate canvas:
            $bCanvas = imagecreatetruecolor($bigImage[0], $bigImage[1]);
            $mCanvas = imagecreatetruecolor($mediumImage[0], $mediumImage[1]);
            $lCanvas = imagecreatetruecolor($listImage[0], $listImage[1]);
            $tCanvas = imagecreatetruecolor($thumbnail[0], $thumbnail[1]);

            // Copy content:
            imagecopyresampled($bCanvas, $image, 0, 0, 0, 0, ($bigImage[0] * $sourceAspect), ($bigImage[1] / $sourceAspect), $imageSize[0], $imageSize[1]);
            imagecopyresampled($mCanvas, $image, 0, 0, 0, 0, $mediumImage[0], $mediumImage[1], $imageSize[0], $imageSize[1]);
            imagecopyresampled($lCanvas, $image, 0, 0, 0, 0, $listImage[0], $listImage[1], $imageSize[0], $imageSize[1]);
            imagecopyresampled($tCanvas, $image, 0, 0, 0, 0, $thumbnail[0], $thumbnail[1], $imageSize[0], $imageSize[1]);

            // Save images:
            $saveB = imagejpeg($bCanvas, $targetFile.'_big.jpg', 90);
            $saveM = imagejpeg($mCanvas, $targetFile.'_medium.jpg', 90);
            $saveT = imagejpeg($lCanvas, $targetFile.'_list.jpg', 90);
            $saveT = imagejpeg($tCanvas, $targetFile.'_thumb.jpg', 90);

            // Destroy images:
            imagedestroy($image);
            imagedestroy($bCanvas);
            imagedestroy($mCanvas);
            imagedestroy($lCanvas);
            imagedestroy($tCanvas);

            // Watermark images:
            $mark = imagecreatefrompng("logo.png");
            list($mwidth, $mheight) = getimagesize("logo.png");
            $img = imagecreatefromjpeg($targetFile.'_big.jpg');

            list($bwidth, $bheight) = getimagesize($targetFile.'_big.jpg');
            imagecopy($img, $mark, $bwidth-$mwidth-25, $bheight-$mheight-25, 0, 0, $mwidth, $mheight);
            imagejpeg($img, $targetFile.'_big.jpg', 100);
            imagedestroy($img);

        } else {
            echo "0";
        }

    } else {
        move_uploaded_file($tempFile,$targetFile.'.'.$fileExtension);
    }

如果有人能帮我解决这个问题,我会非常高兴。我一直在尝试几种方法,但它们似乎都没有正常工作。正如您在顶部看到的,我已经在变量“bigImage”、“mediumImage”、“listImage”和“thumbnail”中定义了要使用的画布尺寸。

提前致谢! // 乔纳森

【问题讨论】:

  • 据我所知,GD 无法做到这一点,但 Imagick 会提供这些可能性。

标签: php resize gd uploadify crop


【解决方案1】:

调整图像大小的方法不止一种。我会为你拼写出来:

  • 拉伸以适应 - 忽略纵横比,将图像调整为所需大小
  • Scale to fit -- 调整图像大小,使一个维度(宽度或高度)具有所需的大小,而另一个维度相同或更短,同时保持纵横比(可能需要一个额外的步骤来用纯色填充较短的一侧)
  • Crop to fit -- 调整图像大小,使一个维度(宽度或高度)具有所需的大小,而另一个维度相同或更长,同时保持纵横比(需要一个额外的步骤来修剪外部区域)

PS:两篇文章都是我写的。

【讨论】:

  • 谢谢,我尝试使用您的文章,但最终得到了一个全黑的图像。我不知道为什么,但是我已经多次检查了代码,但我找不到问题所在。这是我使用您的函数的代码:pastebin.com/XgDvUEWe
  • @Jonathan,我启用了完整的错误报告来定位问题;您的粘贴的修订版可在 pastebin.com/J41aPe9g 获得
  • @Salman 谢谢,不错的文章,这些对我来说确实是节省时间的解决方案。
猜你喜欢
  • 2014-03-02
  • 2013-10-05
  • 2012-11-13
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
相关资源
最近更新 更多