正确的标准化图像的方法

时间:2012-07-31 07:42:30

标签: php api web amazon

我正在构建一个将使用Amazon Product Advertising API的Web应用程序。问题是API返回每种产品的不同大小和宽高比的图像。如果我将所有图像调整为静态宽度/高度,则由于比率的变化,其中一些图像看起来很奇怪。图像将以每行四个的方式排列。我想我只会使图像的宽度相同,同时保持纵横比相同,然后在API返回一些奇怪大小的图像时,为高度设置某种最大阈值。

但是,我想看看这里的人们是否曾遇到过这个问题以及他们对这个设计问题的想法是什么?

2 个答案:

答案 0 :(得分:2)

什么是共同发病率。我遇到了类似的问题,这就是我决定向前迈进的方式。它可能不是最好的解决方案,但它对我有用。

首先,我获得图像的原始高度和宽度

list($width, $height) = getimagesize("path to image");

然后我找出两者的最大公约数,并将宽度和高度比存储在变量中,例如$wr$hr

然后通过比较水平方向的$wr > $hr和垂直方向的$hr > $wr来检查图像方向(水平或垂直)

如果是水平的,我确保拇指大小不超过某个值,比如120px,并根据宽高比使高度对应于120px。如果方向是垂直的,则完成相同的操作。

答案 1 :(得分:0)

我在尝试标准化徽标时遇到了同样的问题。起初,我认为我可以选择一个标准区域并将所有图像调整到该区域,但该策略存在两个问题。首先,你必须设置高度和宽度的限制,所以有时你会得到面积较小的图像,因为它们非常宽或高。其次,这可能会使您的布局看起来很丑陋。在我的情况下,我有一个顶部的标题,一个图像,然后下面的文字。我意识到一个非常宽的图像会在标题和文本之间留下很大的差距。因此,我需要一个优先考虑宽度的解决方案。我的意思是图像可以在不改变高度的情况下改变宽度。不同的应用程序可能有不同的要求,但我认为我的解决方案允许任何情况,例如对高度的偏好:

function width_to_height($width, $slope, $icpt){
    if ($width == 0){
        return FALSE;
    }
    return floor(($icpt + sqrt(pow($icpt, 2) + 4*$slope*pow($width, 2)))/(2*$width));
} 

function ratio_to_height($ratio, $slope, $icpt){
    if ($ratio == 0){
        return FALSE;
    }
    $area = $ratio*$slope + $icpt;
    return floor(sqrt($area/$ratio));
}   

function calc_dims($width, $height, $max_w=168, $max_h=100){
    $slope = 2500;
    $icpt = 6000;
    $ratio = $width/$height;
    $max_ratio = $max_w/$this->width_to_height($max_w, $slope, $icpt);
    if ($ratio > $max_ratio){
        $ht = floor($max_w/$ratio);
        return array('width' => $max_w, 'height' => $ht);
    }
    $ht = $this->ratio_to_height($ratio, $slope, $icpt);
    if ($ht > $max_h){
        $wd = floor($max_h*$ratio);
        return array('width' => $wd, 'height' => $max_h);
    }
    $wd = floor($ht*$ratio);
    return array('width' => $wd, 'height' => $ht);
}

主要功能是calc_dims(),它调用另外两个函数。由于我几乎总是使用类,因此使用“this->”调用这些函数。运营商。如果您不使用类,则只需删除操作符即可。

你可以看到我对一些变量进行了硬编码。 (在我的实际应用程序中,这些是从配置文件调用的。)$ max_w和$ max_h非常自我解释为图像的最大高度和宽度。然而,$ slope和$ icpt可能有点难以理解。正如您在ratio_to_height()函数中看到的那样,$ slope和$ icpt(intercept)是区域与图像宽高比之间线性关系的分量。

您可以使用我提供的值($ slope = 2500; $ icpt = 6000),或者您可以自己计算。我想过更多的自动化过程,但由于参数是高度主观的,它似乎不太实用。为了计算它们,有必要为两个不同的纵横比实例定义区域,其中比率为$ width / $ height。例如,当比率为1($ width = $ height)时,您可能希望该区域为8000像素^ 2,当比率为2($ width = 2 * $ height)时,该区域可能为12000像素^ 2。有了这些价值,我们就有了:

$A1 = 8000;
$A2 = 12000;
$r1 = 1;
$r2 = 2;

您可以按如下方式计算斜率和截距:

$slope = ($A2 - $A1)/($r2 - $r1);
$icpt = $A1 - $slope*$r1;