-1

写真の縦横比を取得しようとしていますが、次のコードは、幅 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);

どうすれば問題を解決できますか?

前もって感謝します。

4

2 に答える 2

3

実際、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";

上記のテストでは、次のように出力されます。

found: 16:9
match: 16:9

found: 472:315
match: 3:2

found: 3:2
match: 3:2

*参照が必要な場合は、ウィキペディアから「標準」の縦横比のリストを取得しました。

于 2012-10-19T03:49:24.513 に答える