他の回答は、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;
}