• ベストアンサー
  • 困ってます

この計算の意味を教えて下さい。

  • 質問No.2254217
  • 閲覧数81
  • ありがとう数0
  • 回答数3

お礼率 37% (75/202)

いつもはプログラムのカテゴリに投稿させてもらってるのですが、バリバリの文系でして、よくプログラム中の計算で行き止まってしまいます。
今回は、この計算の説明をしていただけないでしょうか?

大きい画像を小さい画像に縦横の比率を変えずにリサイズする場合の問題なのですが、

リサイズするサイズをはじめに定義してあります。
横幅 WIDTH = 200
高さ HEIGHT = 160
です。
元画像の横幅 sx
元画像の高さ sy

もし横幅が高さより大きかった場合は
横幅は WIDTH にして
高さは WIDTH * sy / sx
となっています。
逆に高さの方が大きかった場合は
高さを HEIGHT にして
横幅を HEIGHT * sx /sy
で求めています。
何故このような計算になるのか説明をしていただけないでしょうか?
説明がわかりにくかったらごめんなさい。
よろしくお願いいたします。

質問者が選んだベストアンサー

  • 回答No.3
  • ベストアンサー

ベストアンサー率 62% (1578/2526)

まず1つ疑問がありますが、
元画像の横幅 200
元画像の高さ 180
だとします。これは横幅が高さよりも大きい状態ですから、
横幅は WIDTH=200 にして、
高さは計算式から 200*180/200=180となります。
この結果は高さHEIGHT=160 を超えますが、それでもいいのでしょうか?
もし、リサイズの際に元画像の縦横比を変えず、なおかつ定義した
横幅 WIDTH = 200 と 高さ HEIGHT = 160 の枠内に収めるならば、
ご質問の判別・計算式では上記のような矛盾が出ます。
また、元画像が正方形の時は縦横のどちらが大きいかの判別式によって
200x200と160x160という2種類のリサイズ画像サイズが
存在しえます。

もし、高さ160x横幅200の枠内におさめるならば、
160/200=0.8 ←定義した枠の高さ/横幅
を基準として、元画像の高さ/横幅 sy/sx が 0.8 より小さければ
(例:160/400)上段の横幅をWIDTH に、大きければ(例:200/200)
下段の高さをHEIGHTにする式にあてはめないとダメではないでしょうか?

元画像の高さ/横幅は sy/sx です。
もしsy/sxが 0.8 より小さかった場合は(横長タイプ)
横幅は WIDTH にして
高さは WIDTH * sy / sx
逆にsy/sxが 0.8 より大きかった場合は(縦長タイプ)
高さを HEIGHT にして
横幅を HEIGHT * sx /sy
とすれば枠内に収まります。

計算式はイメージとして
横幅を基準に高さを出すには 横幅x高さ÷横幅 → 高さ
高さを基準に横幅を出すには 高さx横幅÷高さ → 横幅
と考えるとわかりやすいかもしれません。

なお、ここでは横幅の200が暗算しやすいので高さ/横幅としました。

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 56% (913/1604)

縦横の比率を変えないのだから、
横幅>高さ のとき、
  元画像の横幅:元画像の高さ=sx:sy・・・(1)
 リサイズ後の高さをHとすると、
  リサイズ後の横幅:リサイズ後の高さ=WIDTH:H・・・(2)
 (1)=(2)なので、sx:sy=WIDTH:H
 (比では、a:b=c:dのときad=bcがなりたつので、)
 sx*H=sy*WIDTH
 H=WIDTH*(sy/sx)

 「簡単にいえば、横幅sxをWIDTHにしたということは、
  画像を(WIDTH/sx)倍したので、高さsyも(WIDTH/sx)倍するから
  sy*(WIDTH/sx)=WIDTH*(sy/sx)になる、ということです。」

横幅<高さのとき、同じように考えて、(リサイズ後の横幅をWとして)
 sx:sy=W:HIGHT
 sy*W=sx*HIGHT
 W=HIGHT*(sx/sy)
 
  • 回答No.1

ベストアンサー率 22% (40/177)

例えばsxとsyに数値当てはめて考えて見ましょう

例えばsx=400,sy=200とすれば、
横幅のほうが大きいから横幅を基準として、
横幅=WIDTH=200ですね。
次に縦幅ですが元の比率を変えずに、ということなので比率を考えます。
sx:sy=400:200=2:1ですね。つまり縦幅は横幅の2分の1ということになります。これを式で表せば
縦幅=WIDTH*sy/sx=200*400/200
         =200*1/2
         =100
となります。

縦幅のほうが大きい場合も同様です。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ