72

ソース長方形と宛先長方形があります。宛先の長方形内に収まり、元のアスペクト比を維持しながら、ソースをスケーリングできる最大スケールを見つける必要があります。

Googleはそれを行う1つの方法を見つけましたが、それがすべての場合に機能するかどうかはわかりません。これが私の自家製の解決策です:

  • 各長方形の高さ/幅を計算します。これにより、対角線msrcとの傾きが得られmdestます。
  • の場合msrc < mdst、ソース幅をデスティネーションに合わせてスケーリングします(そして同じ比率で高さをスケーリングします)
  • それ以外の場合は、ソースの高さをデスティネーションのさに合わせてスケーリングします(同じ比率で幅をスケーリングします)

この問題に対する他の可能な解決策を探しています。私のアルゴリズムがすべての場合に機能するかどうかさえわかりません!

4

5 に答える 5

143
scale = min(dst.width/src.width, dst.height/src.height)

これはあなたのアプローチですが、よりきれいに書かれています。

于 2009-09-03T14:50:34.423 に答える
13

別のオプションは、最大幅にスケーリングしてから、スケーリングされた高さが最大許容高さよりも大きいかどうかを確認し、大きい場合は高さでスケーリングする(またはその逆)ことです。

scale = (dst.width / src.width);
if (src.height * scale > dst.height)
 scale = dst.height / src.height;

このソリューションは、より短く、より速く、より理解しやすいと思います。

于 2009-09-03T12:18:48.187 に答える
2
  1. destWidth / srcWidthとの小さい方を計算しますdestHeight / srcHeight
  2. それによるスケール

もちろん、数式の一部を移動して、メソッドと同じように編集します。私の意見では、これは意味的にはより明確ですが、それだけです-意見です。

于 2009-09-03T12:14:46.227 に答える
1

すべての次元がゼロ以外の場合、次のコードを使用します(基本的にコードと一致します)。

scaleFactor = (outerWidth / outerHeight > innerWidth / innerHeight) 
    ? outerHeight / innerHeight
    : outerWidth / innerWidth

これは、必要に応じて任意の次元をゼロにできるように変更することもできます。

于 2009-09-03T12:41:59.357 に答える
0

他の回答は、sourceWidthまたはsourceHeightのいずれかがゼロになると、ゼロ除算の例外が生成されるリスクがあります。これを防ぐために、比較を数学的に同等の複数の式に書き直す必要があります。また、無限スケールのシナリオをキャッチするための追加のエッジ条件。

縮尺は別として、ターゲットの長方形の寸法が本当に必要だったので、ここでは縮尺の計算とターゲットの長方形の計算について説明します。

無限のエッジ条件があるため、ターゲットの長方形はより堅牢で便利になると思います。

    if (sourceWidth == 0 && sourceHeight == 0) {
        // scale = Infinity;
        outputWidth = 0;
        outputHeight = 0;
        outputX = destWidth / 2;
        outputY = destHeight / 2;
    } else if (destWidth * sourceHeight > destHeight * sourceWidth) {
        scale = destHeight / sourceHeight;
        outputWidth = sourceWidth * destHeight / sourceHeight;
        outputHeight = destHeight;
        outputX = (destWidth - outputWidth) / 2;
        outputY = 0;
    } else {
        scale = destWidth / sourceWidth;
        outputWidth = destWidth;
        outputHeight = sourceHeight * destWidth / sourceWidth;
        outputX = 0;
        outputY = (destHeight - outputHeight) / 2;
    }
于 2018-06-15T04:16:14.447 に答える