imagecopy已调整大小的PHP存在问题

imagecopy已调整大小的PHP存在问题,php,gd,Php,Gd,我正试图使一个网络应用程序,其中有一个管理网站,你可以上传图像。我已经在使用imagecopy()制作方形照片。但是当图像太大时,我会尝试使用imagecopyresized()调整大小。我已经使用了以下代码: $file = $_FILES['img']['tmp_name']; $filename = $_FILES['img']['name']; $size = 400; $destino = imagecreatetruecolor($size, $size); list($width,

我正试图使一个网络应用程序,其中有一个管理网站,你可以上传图像。我已经在使用
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
是以增长指数为计数的最终宽度。

您对PHP如何处理资源以及GD函数如何工作做出了一些错误的假设

$modified = $origen;
上面这行没有给你两个独立的图像资源;它为您提供了两个指向内存中相同图像资源的变量。这意味着其中一个上的任何操作都将反映在另一个上

这会导致您在以下行中出现两个错误:

imagecopyresized($origen, $modified, 0, 0, 0, 0, $final, $newwidth, $width, $height);
  • 此函数不调整目标图像(
    $origen
    )或源图像(
    $modified
    )的大小;它调整从源图像复制的图像部分的大小(即,代码中
    $modified
    的指定部分)
  • 由于
    $origen
    $modified
    指向同一个资源,因此函数会将图像的大小调整副本粘贴到自身顶部,如下所示:

  • 最后你打电话:

    imagecopy($destino, $origen, 0, 0, $widths, $heights, $size, $size);
    
    这里的一个问题是,
    $widths
    $heights
    是在
    $origen
    调整大小之前计算的,但实际上问题是隐藏的,因为(如上所述)
    $origen
    没有调整大小

    以上所有操作的结果是从原始图像的中间进行方形“切割”,如下所示:

    以下是我如何调整输入图像的大小,使其适合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...
    

    请注意,这将导致输出的上/下(横向图像)或左/右(纵向图像)出现黑条。在调用
    imagecopyresized
    更改此项之前,您可以使用颜色或透明度填充
    $dest

    Wow men!你救了我的命!谢谢