调整图像副本大小的问题 PHP

Issue with imagecopy resized PHP

我正在尝试制作一个具有管理站点的网络应用程序,您可以在其中上传图片。我已经在使用 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);
  1. 此函数不会调整目标图像 ($origen) 或源图像 ($modified) 的大小;它会调整从源图像复制的图像部分的大小(即代码中 $modified 的指定部分)。
  2. 因为 $origen$modified 指向相同的资源,函数将调整大小后的图像副本粘贴到自身之上,如下所示:

最后你打电话:

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

这里的一个问题是 $widths$heights 是在 $origen 调整大小之前计算的,但实际上问题是隐藏的,因为(如上所述)$origen未调整大小!

以上所有的结果就是给你一个正方形'cut'从原图中间开始,像这样:

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

请注意,这将导致输出的 top/bottom(横向图像)或 left/right(纵向图像)出现黑条。您可以在 imagecopyresized 调用之前用颜色或透明度填充 $dest 来更改它。