imagecopy的问题调整了PHP的大小

时间:2017-05-29 18:49:16

标签: php gd

我正在尝试创建一个具有管理网站的网络应用,您可以在其中上传图片。我已经在使用imagecopy()制作正方形照片了。但是当图像太大时,我正试图用imagecopyresized()调整大小。我已经使用过这段代码了:

$file = $_FILES['img']['tmp_name'];
$filename = $_FILES['img']['name'];
$size = 400;
$destino = imagecreatetruecolor($size, $size);
list($width, $height) = getimagesize($file);
$correction = $size / 2;
$widths = $width / 2 - $correction;
$heights = $height / 2 - $correction;
$origen = imagecreatefromjpeg($file);
$overflow = $size + 200;

if($width > $overflow){
    $modified = $origen;
    $ratio = $width / $height;
    $growth = $width / $overflow;
    $final = $overflow / $growth;
    if($ratio > 1){
        $newwidth = $final * $ratio;
    }else{
        $newwidth = $final / $ratio;
    }
    imagecopyresized($origen, $modified, 0, 0, 0, 0, $final, $newwidth, $width, $height);
}
imagecopy($destino, $origen, 0, 0, $widths, $heights, $size, $size);

这里的问题是没有对大于$overflow的图像进行修改。

$ratio是为了保持照片的原始尺寸并防止变形。

$growth是一个索引,虽然图像越大,它将被复制的最小值。

$final是将增长指数作为计数的最终宽度。

1 个答案:

答案 0 :(得分:1)

您对PHP如何处理资源以及GD功能如何运作做出了一些不正确的假设。

$modified = $origen;

上面一行为您提供两个单独的图片资源;它为您提供了两个指向内存中相同图像资源的变量。这意味着对一个操作的任何操作都将反映在另一个操作中。

这会导致您使用以下行犯两个错误:

imagecopyresized($origen, $modified, 0, 0, 0, 0, $final, $newwidth, $width, $height);
  1. 此功能不会调整目标图像($origen)或源图像($modified)的大小;它会调整从源图像复制的图像部分(即代码中$modified的指定部分)。
  2. 由于$origen$modified指向相同的资源,因此该功能会将调整后的图像副本粘贴在其自身之上,如下所示:

    moaning lisa doubled

  3. 最后你打电话:

    imagecopy($destino, $origen, 0, 0, $widths, $heights, $size, $size);
    

    此处的问题是$widths$heights是在$origen调整大小之前计算出来的,但实际上问题是隐藏的,因为(如上所述)$origen isn&# 39;重新调整大小!

    上述所有结果都是为了给你一个正方形的剪切'从原始图像的中间,像这样:

    moaning lisa squared

    以下是我如何调整输入图像的大小以适应400x400px并将其置于输出中心:

    $file = $_FILES['img']['tmp_name'];
    
    $maxW = $maxH = 400;
    list($srcW, $srcH) = getimagesize($file);
    $ratio = $srcW / $srcH;
    
    $src = imagecreatefromjpeg($file);
    $dest = imagecreatetruecolor($maxW, $maxH);
    
    if ($ratio > 1) {
        // landscape.
        $destH = ($maxH / $ratio);
        imagecopyresized($dest, $src, 0, ($maxH / 2) - ($destH / 2), 0, 0, $maxW, $destH, $srcW, $srcH);
    } else {
        // portrait (or square).
        $destW = ($maxW * $ratio);
        imagecopyresized($dest, $src, ($maxW / 2) - ($destW / 2), 0, 0, 0, $destW, $maxH, $srcW, $srcH);
    }
    // now do whatever you want with $dest...
    

    请注意,这会导致输出的顶部/底部(横向图像)或左/右(纵向图像)出现黑条。您可以在$dest来电之前使用颜色或透明度填充imagecopyresized以更改此内容。