我希望能够允许用户上传图片。使用GD库,我将为图库创建/存储三个不同大小的图像并显示产品。问题是缩放已上传不同尺寸图像的人的尺寸。例如,4000 x 3000图像将缩放到我想要的240 x 180,但是我注意到一些用户具有不同尺寸的图片,这些图片不会缩放到此,例如3008 x 2000和3837 x 2551。
有人可以指导我处理这些不同图像尺寸的最佳方法,以便将它们缩放到通用尺寸。
答案 0 :(得分:1)
您必须设置最终尺寸,例如:300x300像素
然后将两个因子除以原始尺寸,例如
factor1=300/4000 <- Width
factor2=300/3000 <- Heigth
现在,您可以按较小的因子缩放图像。 您现在应该有一个300像素高度或宽度的图像。现在你削减了比最终尺寸更大的东西。完了!
希望有所帮助
答案 1 :(得分:0)
我认为你正在寻找这样一个功能:
function resizePreservingAspectRatio($img, $targetWidth, $targetHeight)
{
$srcWidth = imagesx($img);
$srcHeight = imagesy($img);
// Determine new width / height preserving aspect ratio
$srcRatio = $srcWidth / $srcHeight;
$targetRatio = $targetWidth / $targetHeight;
if (($srcWidth <= $targetWidth) && ($srcHeight <= $targetHeight))
{
$imgTargetWidth = $srcWidth;
$imgTargetHeight = $srcHeight;
}
else if ($targetRatio > $srcRatio)
{
$imgTargetWidth = (int) ($targetHeight * $srcRatio);
$imgTargetHeight = $targetHeight;
}
else
{
$imgTargetWidth = $targetWidth;
$imgTargetHeight = (int) ($targetWidth / $srcRatio);
}
// Creating new image with desired size
$targetImg = imagecreatetruecolor($targetWidth, $targetHeight);
// Add transparency if your reduced image does not fit with the new size
$targetTransparent = imagecolorallocate($targetImg, 255, 0, 255);
imagefill($targetImg, 0, 0, $targetTransparent);
imagecolortransparent($targetImg, $targetTransparent);
// Copies image, centered to the new one (if it does not fit to it)
imagecopyresampled(
$targetImg, $img, ($targetWidth - $imgTargetWidth) / 2, // centered
($targetHeight - $imgTargetHeight) / 2, // centered
0, 0, $imgTargetWidth, $imgTargetHeight, $srcWidth, $srcHeight
);
return $targetImg;
}
用法示例:
$gd = imagecreatefromjpeg("images/image5.jpg");
$resized = resizePreservingAspectRatio($gd, 100, 100);
header("Content-type: image/png");
imagepng($resized);
这个变换这样的图像:
那个: