计算图像尺寸比率以调整大小
image
image-processing
php
7
0

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

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

因此,我想根据原始图像尺寸比率来计算新图像尺寸。可以说,如果上面的示例图片应调整为最大高度768px ,那么宽度呢?它已经小于我的“最大宽度”( 200px) ,因此宽度应该保持不变吗?还是应该进一步减少?

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

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

我对此表示感谢。

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃
$ratio = $originalWidth / $originalHeight

如果要更改高度:

$targetWidth = $targetHeight * $ratio

如果要更改宽度:

$targetHeight = $targetWidth / $ratio
收藏
评论

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

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只是宽度和高度(目标大小的平方)一个数字。我确定您可以修改它以使用非正方形目标。它还应该给您启发,您可以使用其他调整大小的算法。

收藏
评论

这正在工作。

function calculateDimensions($width,$height,$maxwidth,$maxheight)
{

        if($width != $height)
        {
            if($width > $height)
            {
                $t_width = $maxwidth;
                $t_height = (($t_width * $height)/$width);
                //fix height
                if($t_height > $maxheight)
                {
                    $t_height = $maxheight;
                    $t_width = (($width * $t_height)/$height);
                }
            }
            else
            {
                $t_height = $maxheight;
                $t_width = (($width * $t_height)/$height);
                //fix width
                if($t_width > $maxwidth)
                {
                    $t_width = $maxwidth;
                    $t_height = (($t_width * $height)/$width);
                }
            }
        }
        else
            $t_width = $t_height = min($maxheight,$maxwidth);

        return array('height'=>(int)$t_height,'width'=>(int)$t_width);
    }
收藏
评论

您要保持原始图像的长宽比。这是图像的宽度和高度之间的比率。因此,您可以计算必须在垂直和水平方向上调整图像大小的系数,然后将两者中的较高者保留下来。用伪代码:

target_height = 768
target_width = 1024
# v_fact and h_fact are the factor by which the original vertical / horizontal
# image sizes should be multiplied to get the image to your target size.
v_fact = target_height / im_height 
h_fact = target_width / im_width
# you want to resize the image by the same factor in both vertical 
# and horizontal direction, so you need to pick the correct factor from
# v_fact / h_fact so that the largest (relative to target) of the new height/width
# equals the target height/width and the smallest is lower than the target.
# this is the lowest of the two factors
im_fact = min(v_fact, h_fact)
new_height = im_height * im_fact
new_width = im_width * im_fact
image.resize(new_width, new_height)
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号