首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在考虑比率的情况下,找到最大的放大维度

在考虑比率的情况下,找到最大的放大维度
EN

Stack Overflow用户
提问于 2011-05-12 05:57:35
回答 2查看 111关注 0票数 0

我和一所大学正在尝试建立一种方法,可以找到图像中默认显示的选项的最大尺寸。选择是有一个比率的。

到目前为止,我们已经尝试过了:

代码语言:javascript
复制
public function findBestSizeForRatio($inputW, $inputH, $ratioW, $ratioH)
{
    if($inputW / $ratioW > $ratioH / $inputH){
        $w = floor($inputW / $ratioW) * $ratioW;
        $h = $w * $ratioH / $ratioW;
    }
    else{
        $h = floor($inputH / $ratioH) * $ratioH;
        $w = $h * $ratioW / $ratioH;
    }

    return array($w, $h);
}

但是它没有通过我们的单元测试。

我们还尝试了这个:

代码语言:javascript
复制
public function findBestSizeForRatio($inputW, $inputH, $ratioW, $ratioH)
{
     return $this->findBestSizeInBox($ratioW*10000, $ratioH*10000, $inputW, $inputH);
}
public function findBestSizeInBox($inputW, $inputH, $boxW, $boxH)
{
    if($inputW / $boxW > $inputH / $boxH){
        return array($boxW, round($inputH * $boxW / $inputW));
    }
    else{
        return array(round($inputW * $boxH / $inputH), $boxH);
    }
}

它似乎可以工作,但它并不是像素完美的。由于我们的比率是由小数字组成的,我们需要一个真正尊重比率的方法,即使图像没有100%填充。硬编码*10000这样的常量也是很愚蠢的,因为我们找不到一个好的数学公式。;)

我们还构建了那些PHPUnit测试,这对我们来说似乎很有代表性(所以我们可能忘记了一些案例)

代码语言:javascript
复制
/**
 * @covers Img_GD::findBestSizeInBox
 */
public function testfindBestSizeForRatioReturnValidValueForEasyInput()
{

    $img = new Img_GD();

    //1
    $iW = 400; $iH = 300; //Input image size
    $rW =   4; $rH =   3; //ratio
    $eW = 400; $eH = 300; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

    //2
    $iW = 400; $iH = 3000; //Input image size
    $rW =   4; $rH =   3; //ratio
    $eW = 400; $eH = 300; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

    //3
    $iW = 4000; $iH = 300; //Input image size
    $rW =   4; $rH =   3; //ratio.
    $eW = 400; $eH = 300; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

    //4
    $iW = 400; $iH = 3000; //Input image size
    $rW =   3; $rH =   4; //ratio
    $eW = 399; $eH = 532; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

    //5
    $iW = 4000; $iH = 300; //Input image size
    $rW =   3; $rH =   4; //ratio.
    $eW = 225; $eH = 300; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

    //6
    $iW = 4000; $iH = 300; //Input image size
    $rW =   3; $rH =   4; //ratio.
    $eW = 225; $eH = 300; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

}

/**
 * @covers Img_GD::findBestSizeInBox
 */
public function testfindBestSizeForRatioReturnValidValueForNonExactInput()
{
    $img = new Img_GD();

    //7
    $iW = 403; $iH = 302; //Input image size
    $rW =   4; $rH =   3; //ratio
    $eW = 400; $eH = 300; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

    //8
    $iW = 403; $iH = 3000; //Input image size
    $rW =   4; $rH =   3; //ratio
    $eW = 400; $eH = 300; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

    //9
    $iW = 4000; $iH = 302; //Input image size
    $rW =   4; $rH =   3; //ratio.
    $eW = 400; $eH = 300; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

    //10
    $iW = 403; $iH = 3000; //Input image size
    $rW =   3; $rH =   4; //ratio
    $eW = 402; $eH = 536; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

    //11
    $iW = 4000; $iH = 302; //Input image size
    $rW =   3; $rH =   4; //ratio.
    $eW = 225; $eH = 300; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

    //12
    $iW = 4000; $iH = 302; //Input image size
    $rW =   3; $rH =   4; //ratio.
    $eW = 225; $eH = 300; //Expected
    $this->assertEquals(array($eW, $eH), $img->findBestSizeForRatio($iW, $iH, $rW, $rH), "Img: {$iW} x {$iH} Ratio: {$rW} x {$rH}");

}

有没有能通过所有测试的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-12 11:21:22

试试这个微妙的改变:

代码语言:javascript
复制
public function findBestSizeForRatio($inputW, $inputH, $ratioW, $ratioH)
{
    if($inputW / $ratioW < $inputH / $ratioH){
        $w = floor($inputW / $ratioW) * $ratioW;
        $h = $w * $ratioH / $ratioW;
    }
    else{
        $h = floor($inputH / $ratioH) * $ratioH;
        $w = $h * $ratioW / $ratioH;
    }

    return array($w, $h);
} 

我看到您已经将您的单元测试修复为btilly suggested;很好。

票数 2
EN

Stack Overflow用户

发布于 2011-05-12 07:07:09

让我确定我是正确的。您想要拍摄一张图像,并尽可能地获取最大的块,即具有精确指定的长宽比的矩形。

在这种情况下,请记住单元测试也是代码的规则。当您的单元测试失败时,错误出现在单元测试中的可能性甚至更大。考虑到这一点,您的单元测试看起来是错误的。例如,#4.533/400的比例不是精确的4/3。这个精确比率的最佳答案是532/399。

如果你愿意放宽比率的精确度,那么你应该这样做:

代码语言:javascript
复制
public function findBestSizeForRatio($inputW, $inputH, $ratioW, $ratioH)
{
    if($inputW / $ratioW > $ratioH / $inputH){
        $w = $inputW;
        $h = round($w * $ratioH / $ratioW);
    }
    else{
        $h = $inputH;
        $h = round($h * $ratioW / $ratioH);
    }

    return array($w, $h);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5971101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档