计算图像大小比率以调整大小

2022-08-30 10:19:59

我有一个定义的固定宽度和高度来调整图像大小。但是,我对此有疑问,因为图像可以具有任何类型的大小比(可以是垂直的,也可以是水平的)。在这种情况下,固定的宽度和高度会导致问题。我想以更智能的方式计算宽度和高度

例如,假设我定义了宽度1024px和高度768px。我想调整垂直图像的大小(高度1100px,宽度200px)。因此,在我的情况下,它将调整为固定大小(1024x768),因此宽度将从100px增加到768px,并且它将非常丑陋。同样,如果图像的高度小于768px,它将通过强制将高度增加到768px

因此,我想根据原始图像大小比计算新的图像大小。假设上面的示例图像应该调整为768px的最大高度,那么宽度呢?它已经小于我的“最大宽度”,即200px,那么宽度应该保持不变吗?还是应该进一步减少?

同样,如果图像的高度为 200px,宽度为 1100px。所以宽度应该减少到1024px,但是高度呢?

第三个问题是,假设高度和宽度都大于最大高度和最大宽度,假设宽度:1100px和高度:4000px。现在,由于宽度和高度都大于最大宽度和最大高度,但图像是垂直的,因此它将使其水平。那么,在这种情况下,我该如何检查是否应该根据最大高度或最大宽度调整图像大小?

我感谢任何帮助。


答案 1

这是我个人抓取的图像大小调整代码包中的代码。首先,您需要的数据:

list($originalWidth, $originalHeight) = getimagesize($imageFile);
$ratio = $originalWidth / $originalHeight;

然后,此算法尽可能地将图像拟合到目标大小中,保持原始纵横比,而不是拉伸图像大于原始图像:

$targetWidth = $targetHeight = min($size, max($originalWidth, $originalHeight));

if ($ratio < 1) {
    $targetWidth = $targetHeight * $ratio;
} else {
    $targetHeight = $targetWidth / $ratio;
}

$srcWidth = $originalWidth;
$srcHeight = $originalHeight;
$srcX = $srcY = 0;

这会裁剪图像以完全填充目标大小,而不是拉伸它:

$targetWidth = $targetHeight = min($originalWidth, $originalHeight, $size);

if ($ratio < 1) {
    $srcX = 0;
    $srcY = ($originalHeight / 2) - ($originalWidth / 2);
    $srcWidth = $srcHeight = $originalWidth;
} else {
    $srcY = 0;
    $srcX = ($originalWidth / 2) - ($originalHeight / 2);
    $srcWidth = $srcHeight = $originalHeight;
}

这完成了实际的调整大小:

$targetImage = imagecreatetruecolor($targetWidth, $targetHeight);
imagecopyresampled($targetImage, $originalImage, 0, 0, $srcX, $srcY, $targetWidth, $targetHeight, $srcWidth, $srcHeight);

在本例中,宽度和高度(方形目标大小)只有一个数字。我相信你可以修改它以使用非平方目标。它还应该为您提供有关可以使用的其他调整大小算法的灵感。$size


答案 2
$ratio = $originalWidth / $originalHeight

如果要更改高度:

$targetWidth = $targetHeight * $ratio

如果要更改宽度:

$targetHeight = $targetWidth / $ratio

推荐