PHP 检查并调整图像大小以满足 Instagram 要求

PHP check & resize image to meet Instagram requirements

Instagram 图片比例要求为:

已读 here and here. The documentation 还说:

(...) Advise the app user to try again with an image that falls withing a 4:5 to 1.91:1 range.

尽管文档没有说明,但我知道发布具有 1:1 比例的照片是可行的。

所以我想检查上传的图片是否符合要求,如果没有调整大小以满足要求(通过缩小尺寸或放大尺寸)。我正在使用 Laravel 和 Image Intervention library

要检查宽高比,我使用以下代码:

public function isRatioValid($img)
{
    $manager = new ImageManager(['driver' => 'imagick']);
    $image = $manager->make($img);
    $width = $image->width();
    $height = $image->height();
    
    for ($i = $height; $i > 1; $i--) 
    {
        if (($width % $i) == 0 && ($height % $i) == 0) 
        {
            $width = $width / $i;
            $height = $height / $i;
        }
    }

    $ratio = "{$width}:{$height}";

    if (!in_array($ratio, ['1:1', '4:5', '1.91:1', '16:9']))
        return false;
        
    return true;
}

问题:

  1. 此代码严格检查比率值,它并不完全符合 Instagram 文档中所说的“(...) with a 4:5 to 1.91:1 range”。这样可以吗?
  2. 如果比例无效,我如何使用 Resize 功能来应用符合 Instagram 要求的最佳比例?

已解决.

检查宽高比的代码不正确。要正确检查它,我们需要做的就是将宽度除以高度,看看它是否符合 Instagram 要求的范围。

function isRatioValid(...)
{
    $width = 400;
    $height = 711;

    // 1:1 - squares
    if ($width == $height)
        return true;
            
    $ratio = round($width / $height, 3);
        
    // Portrait: min 0.8 | max 0.99
    // Landscape: min 1.01 | max 1.91   
    if ($width < $height)
        if ($ratio >= 0.8 && $ratio <= 0.99)
            return true;
            
    if ($width > $height)
        if ($ratio >= 1.01 && $ratio <= 1.91)
            return true;
    
    return false;
}

为了调整它的大小,我在宽度(肖像)或高度(风景)中添加了 0.10 直到纵横比在范围内。您应该限制尝试次数,这样它就不会耗尽 CPU / 最大执行时间。