一尘不染

计算长宽比的算法是什么?

algorithm

我计划将其与JavaScript配合使用以裁剪图像以适合整个窗口。

编辑 :我将使用仅接受如下格式的长宽比的第三方组件:4:316:9


阅读 2020

收藏
2020-07-28

共1个答案

一尘不染

我发现您正在寻找integer:integer像这样的可用长宽比解决方案,16:9而不是float:1像这样的解决方案1.77778:1

如果是这样,您需要做的就是找到最大公约数(GCD)并将其除以两个值。GCD是将两个数字均分的最高数字。因此6和10的GCD为2,44和99的GCD为11。

例如,一个1024x768监视器的GCD为256。将这两个值除以该值将得到4x3或4:3。

(递归)GCD算法:

function gcd (a,b):
    if b == 0:
        return a
    return gcd (b, a mod b)

在C中:

static int gcd (int a, int b) {
    return (b == 0) ? a : gcd (b, a%b);
}

int main(void) {
    printf ("gcd(1024,768) = %d\n",gcd(1024,768));
}

这是一些完整的HTML /
Javascript,它显示了一种检测屏幕尺寸并从中计算纵横比的方法。这在FF3中有效,我不确定其他浏览器对screen.width和的支持screen.height

<html><body>
    <script type="text/javascript">
        function gcd (a, b) {
            return (b == 0) ? a : gcd (b, a%b);
        }
        var w = screen.width;
        var h = screen.height;
        var r = gcd (w, h);
        document.write ("<pre>");
        document.write ("Dimensions = ", w, " x ", h, "<br>");
        document.write ("Gcd        = ", r, "<br>");
        document.write ("Aspect     = ", w/r, ":", h/r);
        document.write ("</pre>");
    </script>
</body></html>

它输出(在我怪异的宽屏显示器上):

Dimensions = 1680 x 1050
Gcd        = 210
Aspect     = 8:5

我测试过的其他人:

Dimensions = 1280 x 1024
Gcd        = 256
Aspect     = 5:4

Dimensions = 1152 x 960
Gcd        = 192
Aspect     = 6:5

Dimensions = 1280 x 960
Gcd        = 320
Aspect     = 4:3

Dimensions = 1920 x 1080
Gcd        = 120
Aspect     = 16:9

我希望我能在家里有最后一个,但不幸的是,这是一台工作机器。

如果发现图形调整大小工具不支持长宽比,该怎么办。我怀疑最好的选择是添加字母装订线(就像您在旧电视上观看宽屏电影时在顶部和底部看到的那样)。我将它们添加到顶部/底部或侧面(无论哪一个导致最少的装箱线数量),直到图像满足要求为止。

您可能要考虑的一件事是,图像的质量已从16:9更改为5:4-我仍然记得在介绍信箱技术之前,我在电视上看过的那年高个子,瘦小的牛仔。您最好在每高宽比上拥有一张不同的图像,而只是将实际尺寸调整为适合实际屏幕尺寸的尺寸,然后再将其发送出去。

2020-07-28