Преобразование разрешений в пропорции с помощью PHP - PullRequest
4 голосов
/ 15 ноября 2011

Мне нужна помощь с чем-то очень простым.Я работаю над функцией 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);
        }
    }
},

Ответы [ 4 ]

3 голосов
/ 15 ноября 2011

Следующая функция может работать лучше:

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));
  }
 }
}

Я размещаю этот код в открытом доступе.

3 голосов
/ 15 ноября 2011

Я бы подошел к этому так:

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

Вы должны определить функцию gcd, если у вас не установлено расширение GMP - GNU Multiple Precision.В комментариях к документации есть примеры .

2 голосов
/ 15 ноября 2011

Найти ГКД ширины и высоты разрешения.Разделитесь на этот GCD, и вы получите два числа соотношения сторон.

Редактировать: Брайан сказал это лучше =]

1 голос
/ 15 ноября 2011

К сожалению, это не простая проблема, если вы ссылаетесь на все возможные экраны. Например, вот экран 1024x1024, это 16: 9: http://www.hdtvsolutions.com/AKAI-PDP-4225M.htm

Для квадратных пикселей (большинство компьютерных мониторов) будет работать подход GCD, предложенный другими.

...