我正在尝试创建一个具有管理网站的网络应用,您可以在其中上传图片。我已经在使用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
是将增长指数作为计数的最终宽度。
答案 0 :(得分:1)
您对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
isn&# 39;重新调整大小!
上述所有结果都是为了给你一个正方形的剪切'从原始图像的中间,像这样:
以下是我如何调整输入图像的大小以适应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
以更改此内容。