“裁剪”图像以适合容器尽可能接近所需尺寸而不会失去比例

时间:2012-10-13 01:21:08

标签: php css image resize

这是我的困境。我有一个315x210px的盒子,以及各种随机大小的图像,一些像疯狂的宽高比(如210:1),还有一些比例如2:3等。

我正在尝试将这些图像嵌入到框中,使它们尽可能接近315x210px,而不会弄乱纵横比。

我也不想使用缩略图,所以我嵌入了原始图像,并使用php计算宽度/高度,并使用css来隐藏溢出。

我的问题是我遇到了障碍,无法想出更有效的方法。我现在的方法开始时效率不高,所以任何帮助都会受到赞赏。

第一个if / while在某种程度上工作得很好,但是当我做第二个if / while时我意识到我正在做的事情会导致服务器崩溃的死循环。因此,第二个if从未真正完成,所以我不指望它能够工作。它就在那里展示我的概念。

我对全新的想法持开放态度,但我要求的是,无论是什么,都不涉及创作和缩略图。我希望原始图像是嵌入的图像。

    if($width_orig <= 315 && $height_orig <= 210){
        while($newWidth <= 315 || $newHeight <= 210){
            $newWidth = round($newWidth*1.2);
            $newHeight = round($newHeight*1.2);
        }
    }
    //This one was never intended to work. It's just for example.
    else if($width_orig >= 315 && $height_orig >= 210){
        while($newWidth >= 315 || $newHeight >= 210){
            $newWidth = round($newWidth*1.2);
            $newHeight = round($newHeight*1.2);
        }
    }
    else
    {
        $newWidth = 315;
        $newHeight = 210;
    }

2 个答案:

答案 0 :(得分:1)

你可以尝试

$imageHeight = 500;
$imageWidth = 600;

$maxHeight = 315;
$maxWidth = 210;

$max = ($maxWidth > $maxHeight) ? $maxWidth : $maxHeight;
$ratio = max($imageWidth, $imageHeight) / $max;

$ratio = max($ratio, 1.0);

$newHeight = ceil($maxHeight / $ratio);
$newWidth = ceil($imageWidth / $ratio);

var_dump("Height From: $imageHeight -> $newHeight", "Width From : $imageWidth  -> $newWidth " );

输出

string 'Height From: 500 -> 166' (length=18)
string 'Width  From: 600 -> 315' (length=20)

答案 1 :(得分:0)

好吧,您可以使用

之类的分区,而不是在小图像上进行迭代
if($width_orig <= 315 && $height_orig <= 210){
    $ratio = $width_orig/$height_orig;
    if($ratio > 1.5){ //wider than the desired ratio
        $multby = 315 / $width_orig;
    } else {
        $multby = 315 / $height_orig;
    }
     $newWidth = round($newWidth*$multby)
     $newHeight = round($newHeight*$multby)
}

为了变小,那个图像比一个或两个尺寸的盒子大,我想你会把它放在中心,但它可能看起来不太正常。您可以使用与上面相同的代码,只需删除外部if语句,因为您计划隐藏溢出。你总是想要这个盒子装满吗?如果是这样,为什么不这样删除呢?

$ratio = $width_orig/$height_orig;
if($ratio > 1.5){ //wider than the desired ratio
    $multby = 315 / $width_orig;//won't always be greater than 1 without the outside loop
} else {
    $multby = 315 / $height_orig;
}
 $newWidth = round($newWidth*$multby)
 $newHeight = round($newHeight*$multby)