[解決済み] アスペクト比を計算するためのアルゴリズムとは?
質問
JavaScriptで画像をウィンドウ全体に収まるように切り抜くのに使う予定です。
編集
: のような形式のアスペクト比しか受け付けないサードパーティ製コンポーネントを使うことにします。
4:3
,
16:9
.
~12歳編集:この手の質問は割と面白いですねー。ここに何かあるのでしょうか? 絶対に!
どのように解決するのですか?
使用可能なアスペクト比をお探しなのでしょうか?
integer:integer
のような解決策を求めているようです。
16:9
よりも、むしろ
float:1
のような解決策ではなく
1.77778:1
.
もしそうなら、必要なことは最大公約数(GCD)を見つけて、それで両方の値を割ることです。GCDは、両方の数を均等に割る最も大きい数です。つまり、6と10のGCDは2であり、44と99のGCDは11です。
たとえば、1024x768のモニタのGCDは256です。両方の値をその値で割ると、4x3 または 4:3 になります。
(再帰的な) GCD アルゴリズム。
function gcd (a,b):
if b == 0:
return a
return gcd (b, a mod b)
C言語では
static int gcd (int a, int b) {
return (b == 0) ? a : gcd (b, a%b);
}
int main(void) {
printf ("gcd(1024,768) = %d\n",gcd(1024,768));
}
そして、画面サイズを検出し、そこからアスペクト比を計算する1つの方法を示す完全なHTML/Javascriptがここにあります。これは FF3 で動作しますが、他のブラウザがどのように
screen.width
と
screen.height
.
<html><body>
<script type="text/javascript">
function gcd (a, b) {
return (b == 0) ? a : gcd (b, a%b);
}
var w = screen.width;
var h = screen.height;
var r = gcd (w, h);
document.write ("<pre>");
document.write ("Dimensions = ", w, " x ", h, "<br>");
document.write ("Gcd = ", r, "<br>");
document.write ("Aspect = ", w/r, ":", h/r);
document.write ("</pre>");
</script>
</body></html>
出力されます(私の変なワイド画面モニターで)。
Dimensions = 1680 x 1050
Gcd = 210
Aspect = 8:5
その他、私がテストしたもの。
Dimensions = 1280 x 1024
Gcd = 256
Aspect = 5:4
Dimensions = 1152 x 960
Gcd = 192
Aspect = 6:5
Dimensions = 1280 x 960
Gcd = 320
Aspect = 4:3
Dimensions = 1920 x 1080
Gcd = 120
Aspect = 16:9
最後の1台が家にあればいいのですが、いや、残念ながら仕事用のマシンです。
アスペクト比がグラフィック リサイズ ツールでサポートされていないことがわかった場合にどうするかは、別の問題です。最善の策は、レターボックスの線 (ワイド画面の映画を見るときに、古いテレビの上部と下部に表示されるようなもの) を追加することだと思います。私は、画像が要件を満たすまで、上部/下部または側面 (レターボックス ラインの数が最も少なくなる方) にそれらを追加します。
16:9 から 5:4 に変更された画像の品質を考慮する必要があるかもしれません。レターボックスが導入される前に、若い頃にテレビで見た信じられないほど背が高く、細いカウボーイのことを今でも覚えています。アスペクト比ごとに 1 つの異なる画像を用意し、実際の画面の寸法に合わせて正しい画像をリサイズしてから送信したほうがよいかもしれません。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] ゲーム「2048」の最適なアルゴリズムとは?
-
[解決済み] CSSでdivのアスペクト比を維持する
-
[解決済み] CSSによる画像の強制リサイズとアスペクト比の保持
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] javascriptで2つの数値を連結する方法は?
-
[解決済み] JSXとLoadshを使用して、ある要素をn回繰り返す方法
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?