这是我的困境。我有一个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;
}
答案 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)