【问题标题】:Converting Resolutions to Aspect Ratios with PHP使用 PHP 将分辨率转换为纵横比
【发布时间】:2011-12-29 05:50:17
【问题描述】:

我需要一些可能非常基本的帮助。我正在开发一个接收这些可能输入字符串的 PHP 函数(这些是示例,可以是任何分辨率):

1600x900
1440x900
1366x768
1360x768
1280x1024
1280x800
1024x1024
1024x768
640x960
320x480
320x480
etc

我想处理这些字符串中的任何一个并返回适当的纵横比字符串,格式如下:

5:4
4:3
16:9
etc

对解决这个问题的简单方法有什么想法吗?

编辑:这是我一直在使用的参考图表:

http://en.wikipedia.org/wiki/File:Vector_Video_Standards2.svg

编辑:这是 JavaScript 中的答案:

aspectRatio: function(a, b) {
    var total = a + b;
    for(var i = 1; i <= 40; i++) {
        var arx = i * 1.0 * a / total;
        var brx = i * 1.0 * b / total;
        if(i == 40 || (
                Math.abs(arx - Math.round(arx)) <= 0.02 &&
                Math.abs(brx - Math.round(brx)) <= 0.02)) {
            // Accept aspect ratios within a given tolerance
            return Math.round(arx)+':'+Math.round(brx);
        }
    }
},

【问题讨论】:

    标签: php string image image-processing


    【解决方案1】:

    我会这样处理:

    $numbers = explode($input,'x');
    $numerator = $numbers[0];
    $denominator = $numbers[1];
    $gcd = gcd($numerator, $denominator);
    echo ($numerator / $gcd) . ":" . ($denominator / $gcd);
    

    如果您没有安装 GMP — GNU 多精度扩展,则必须定义 gcd 函数。 comments of the documentation中有例子。

    【讨论】:

    • 这很好用,但它报告 1366x768 为 683:384 而不是 16:9。关于如何解决这个问题的想法?
    【解决方案2】:

    找到分辨率的宽度和高度的GCD。除以这个 GCD,就得到两个纵横比数字。

    编辑:布赖恩说得更好 =]

    【讨论】:

      【解决方案3】:

      不幸的是,如果您指的是所有可能的屏幕,这不是一个简单的问题。例如,这是 16:9 的 1024x1024 屏幕:http://www.hdtvsolutions.com/AKAI-PDP-4225M.htm

      对于方形像素(大多数计算机显示器),其他人建议的 GCD 方法将起作用。

      【讨论】:

        【解决方案4】:

        以下功能可能会更好:

        function aspectratio($a,$b){
         # sanity check
         if($a<=0 || $b<=0){
            return array(0,0);
         }
         $total=$a+$b;
         for($i=1;$i<=40;$i++){
          $arx=$i*1.0*$a/$total;
          $brx=$i*1.0*$b/$total;
          if($i==40||(
               abs($arx-round($arx))<=0.02 &&
               abs($brx-round($brx))<=0.02)){
           # Accept aspect ratios within a given tolerance
           return array(round($arx),round($brx));
          }
         }
        }
        

        我将此代码放在公共域中。

        【讨论】:

        • 正如我所说,函数并不精确。如所写,该函数需要所有值的整数。一旦我可以访问命令行解释器,我将在 PHP 中重新测试该方法并更新我的答案。
        • 我的错误,我写了$i=0 而不是正确的$i=1。我已经编辑了我的答案。
        • 另外,你能解释一下你编写上述函数的思考过程以及它是如何工作的吗?在处理此类问题时,我很乐意开始像您一样思考。
        • 正如您在 cmets 中所说的那样,使用 GCD 函数计算纵横比可能会返回不适当的结果,即使是准确的结果。因此,在这种情况下,使用接近精确比率的近似纵横比可能更合适。但是,必须更详细地解释这个答案的“我的思考过程”对于这个网站来说有点离题。
        猜你喜欢
        • 2013-01-19
        • 2012-10-06
        • 2014-07-28
        • 2011-10-27
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 2021-04-23
        • 1970-01-01
        相关资源
        最近更新 更多