2012-10-19 2 views
0

사진의 가로 세로 비율을 가져 오려고하는데 다음 코드는 너비가 3776 세로 높이가 2520 (472 : 315) 인 사진에서 잘못된 가로 세로 비율을 보여 주지만 사진은 너비가 3968, 높이가 2232 (16 : 9)입니다.정확한 가로 세로 비율 표시

function gcd($a, $b) { 
    if($a == 0 || $b == 0) { 
     return abs(max(abs($a), abs($b))); 
    } 

    $r = $a % $b; 
    return ($r != 0) ? gcd($b, $r) : abs($b); 
} 

$gcd = gcd($widtho, $heighto); 
echo ($widtho/$gcd).':'.($heighto/$gcd); 

어떻게하면 내 문제를 해결할 수 있습니까?

미리 감사드립니다.

+0

왜 작동하지 않습니까? 코드 (작동)에 따라 가로 세로 비율을 찾았습니다. 문제가 어디에 있습니까? –

+0

너비가 3776이고 높이가 2520 인 사진은 종횡비가 3 : 2입니다. 아니 472 : 315 (그 종횡비가 존재합니까?!). 따라서 내 문제. – Erik

+0

사실, 3780x2520은 3 : 2의 종횡비입니다. 너비가 3776이므로 472 : 315가 올바른 비율입니다. 부서를 맡으면 1.498에 가까워 꽤 가까이에 있습니다. "표준" "3 : 2"또는 "16 : 9"와 같은 "완벽한"비율을 원하면 가장 가까운/가장 일치하는 것을 찾기 위해 발견 된 비율을 다른 함수로 전달할 수 있습니다. – newfurniturey

답변

4

실제로 3780x2520은 3 : 2의 종횡비입니다. 너비가 3776이므로 472 : 315가 올바른 비율입니다. 당신이 부서를한다면 1.498으로 나오는데, 1.5에 가까워서 3 : 2로 반올림하는 것을 고려해야합니다.

"표준"비율 (예 : "3 : 2"또는 "16 : 9") 만 원할 경우 가장 가까운/가장 일치하는 것을 찾기 위해 검색된 비율을 반올림하는 다른 함수로 전달할 수 있습니다.

는 당신을 위해 라운딩 할 수있는 던져-함께 함수 (만 예에서 치수에 대해 테스트, 그래서 나는 아직 100 % 성공을 보장 할 수 없습니다) :

function findBestMatch($ratio) { 
    $commonRatios = array(
     array(1, '1:1'), array((4/3), '4:3'), array((3/2), '3:2'), 
     array((5/3), '5:3'), array((16/9), '16:9'), array(3, '3') 
    ); 

    list($numerator, $denominator) = explode(':', $ratio); 
    $value = $numerator/$denominator; 

    $end = (count($commonRatios) - 1); 
    for ($i = 0; $i < $end; $i++) { 
     if ($value == $commonRatios[$i][0]) { 
      // we have an equal-ratio; no need to check anything else! 
      return $commonRatios[$i][1]; 
     } else if ($value < $commonRatios[$i][0]) { 
      // this can only happen if the ratio is `< 1` 
      return $commonRatios[$i][1]; 
     } else if (($value > $commonRatios[$i][0]) && ($value < $commonRatios[$i + 1][0])) { 
      // the ratio is in-between the current common-ratio and the next in the list 
      // find whichever one it's closer-to and return that one. 
      return (($value - $commonRatios[$i][0]) < ($commonRatios[$i + 1][0] - $value)) ? $commonRatios[$i][1] : $commonRatios[$i + 1][1]; 
     } 
    } 

    // we didn't find a match; that means we have a ratio higher than our biggest common one 
    // return the original value 
    return $ratio; 
} 

이를 사용하려면를 함수에서 숫자 값이 아닌 비율 문자열을 전달하면 일반 비율 목록에서 "가장 일치하는 항목 찾기"를 시도합니다.

사용 예제 : 다음

$widtho = 3968; 
$heighto = 2232; 
$gcd = gcd($widtho, $heighto); 
$ratio = ($widtho/$gcd).':'.($heighto/$gcd); 
echo 'found: ' . $ratio . "\n"; 
echo 'match: ' . findBestMatch($ratio) . "\n"; 

$widtho = 3776; 
$heighto = 2520; 
$gcd = gcd($widtho, $heighto); 
$ratio = ($widtho/$gcd).':'.($heighto/$gcd); 
echo 'found: ' . $ratio . "\n"; 
echo 'match: ' . findBestMatch($ratio) . "\n"; 

$widtho = 3780; 
$heighto = 2520; 
$gcd = gcd($widtho, $heighto); 
$ratio = ($widtho/$gcd).':'.($heighto/$gcd); 
echo 'found: ' . $ratio . "\n"; 
echo 'match: ' . findBestMatch($ratio) . "\n"; 

위의 테스트 출력됩니다 : 당신이 참조를 원한다면 내가 wikipedia에서 "표준"가로 세로 비율의 목록을했다 *

found: 16:9 
match: 16:9 

found: 472:315 
match: 3:2 

found: 3:2 
match: 3:2 

.

+0

많은 감사! 이제는 매력처럼 작동합니다. D – Erik

+2

@ErikEdgren 굉장히 도움이 되니 기쁩니다. 미래에 어떤 문제가 있음을 알게되면 개정 할 수 있습니다. 누가이 사람이 누구인지 알고있는 사람 = P – newfurniturey

+0

매우 사실 :이 기능에 대한 더 많은 도움이 필요하면 다시 올게요. – Erik