0

这是我的困境。我有一个 315x210 像素的盒子,以及一堆各种随机尺寸的图像,一些具有疯狂的宽度/高度比,例如 210:1,而另一些则具有诸如 2:3 之类的比例。

我正在尝试将这些图像嵌入到盒子中,并让它们尽可能接近 315x210 像素,而不会弄乱纵横比。

我也不想使用缩略图,所以我嵌入了原始图像,并使用 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;
    }
4

2 回答 2

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)
于 2012-10-13T01:38:28.697 回答
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)
于 2012-10-13T01:33:30.650 回答