调整图像副本大小的问题 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);
- 此函数不会调整目标图像 (
$origen
) 或源图像 ($modified
) 的大小;它会调整从源图像复制的图像部分的大小(即代码中 $modified
的指定部分)。
因为 $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
来更改它。
我正在尝试制作一个具有管理站点的网络应用程序,您可以在其中上传图片。我已经在使用 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
未调整大小!
以上所有的结果就是给你一个正方形'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
来更改它。