画面サイズとピクセル数から縦横サイズと解像度をExcelで計算する。

画面のインチ数は分かっているけれど、縦横のサイズがわからないので知りたい、というときがあるかもしれません。私はありました。なので、Excelで計算してみようと思いました。

計算式

2022/01/22 追記

下の方で説明したものを簡単にしました。


次はコピペ用です。

=ATAN(B3 / B2)
=B1 * COS(B4)
=B1 * SIN(B4)
=B2 / B5
=B5 * 25.4
=B6 * 25.4
=GCD(B2, B3)
=B2 / B10
=B3 / B10


以下は以前投稿したものです。

完成画像

画面はこんな感じです。



サイズ、縦横のピクセルを入れると、画面の縦横の長さと解像度、ついでに縦横比を表示するというものです。

対角線の角度を求める

まずは対角線の角度を求めます。縦と横のピクセル数は入力してもらうので、それをもとに対角線の角度を計算します。

最初に縦横のピクセル数からtan(タンジェント)を求めます。tanは直角三角形の b ÷ c で求めます。Excelなら =b/c です。上の例なら = 1200 / 1920 です。これでtanが求められます。要は縦横比です。


tanが計算できたらそれをもとに辺aと辺cのなす角θ(シータ)を求めます。これを人力でやると大変なことになりますが、Excelにはアークタンジェントという便利な関数があります。これを使えば =atan(タンジェント)で簡単にタンジェントからθを求めることができます。

なお、この時求められる角度は度ではなくラジアンです。と言っても、この次のsin(サイン)、cos(コサイン)関数は引数に度ではなくラジアンを指定するのであまり気にする必要はありません。

縦と横の長さを求める

θが計算できてしまえばあとは簡単です。縦は対角線の長さにサインθを掛ければ求められます。例えば24インチのモニターなら 24× sin(θ) ということになります。Excelなら = 24 * sin(θのセル) となります。

このとき、求められる長さはインチなので、mmが必要なら 25.4 を掛けてやります。

同様にして、横の長さを求めるにはcos(θ)を掛けてやります。Excelなら = 24 * cos(θのセル) という式になります。

sin, cos, tan というのは直角三角形の辺の比率のことです。辺aとcがあり、その比率とaの長さがわかっていれば、cの長さは簡単に求めることができます。

解像度を求める

画面の縦もしくは横の長さが計算できてしまえば解像度計算は超簡単です。DPIというのは、Dots Per Inchの略なので、そのまんまドット(ピクセル数)をインチ(長さ)で割ってやれば求めることができます。

例えば、上の例の場合なら、 = 1920 / 20.4 ということになります。これで 94 DPIが求められます。

縦横比を求める

ついでにピクセル数から縦横比も求めてみようかと思いました。

縦横比は単なる比率なので、1920:1200でも縦横比と言えます。でも、これだと普通の人にはイメージしにくいので約分します。

約分するには、二つの数の最大公約数を求めて、それで双方を割ってあげればよいことになります。

人力で最大公約数を求める場合はめんどくさい因数分解をする必要がありますが、Excelには、GCDという関数があるようです。

例えば =gcd(1920, 1200)で、最大公約数 240 を求めることができます。

最大公約数を求めたら、縦と横をそれぞれ割ってあげれば、約分された縦横比の出来上がりです。上の例では240で割って8:5になります。16:10ともいえます。16:9との比較ではこちらの方がわかりやすいと思います。


というわけで、高校の数学がある程度わかれば対角線から縦横のサイズを求めることができるという話でした。(アークタンジェントは高校では習わないかもしれませんが?)



GCDを使わない方法

2020/08/23追記
縦横比の算出を求めてこのページを訪れる方がいらっしゃるようなので。

GCDを使った方法は、縦横の値が割り切れるキリの良い場合にしか使えない方法だと思います。

縦横が割り切れない微妙な数値の場合、次のサイトでは横÷縦の値を基にして、縦横比を算出しています。


function aspect_ratio (x,y) {
var car = { // common aspect ratios we recognize
"3:4" : 3/4,
"1:1" : 1,
"5:4" : 5/4,
"4:3" : 4/3,
"IMAX 1.43:1" : 1.43,
"3:2" : 3/2,
"5:3" : 5/3,
"14:9" : 14/9,
"16:10" : 16/10,
"16:9" : 16/9,
"17:9" : 17/9,
"21:9" : 21/9,
// "Academy ratio 1.375:1" : 1.375,
// "CinemaScope 2.35:1" : 2.35,
// "Cinemara 2.59:1" : 2.59,
// "Ultra Panavision 70 2.75:1" : 2.75,
// "MGM 65 2.76:1" : 2.76,
};
var ratio = x/y;
for (ratio_name in car) {
var r2 = car[ratio_name];
if (Math.abs(r2/ratio-1) < 0.016)  // 1.6% error margin is ok
return ratio_name;
}
// this aspect ratio is unknown.
if (x-0 > y-0) // "1.xx:1"
return round2(x/y) + ":1";
else
return "1:" + round2(y/x);
}
上の関数では、縦横比の入った連想配列を片っ端から見ていき、計算した縦横比と配列の縦横比の差が1.6%未満であれば同一とみなして連想配列の縦横比(文字列)を返しています。

VBAユーザーだと連想配列になじみがないと思いますが、通常の配列やセルを使っても同様のことはできるので難しくはないかと思います。

対象となる値が割り切れない場合には、この方法の方が確実ですね。


2024-02-25 追記
テーブルバージョンを作ってみました。ついでに、縦横比を求める機能も追加してみました。

コメント

アクセス数の多い投稿

セキュリティ対策ソフトのノートンが詐欺ソフトまがいになってしまってショック

ZIPファイルを開こうとすると、展開を完了できません、と言われる

Excel 2019 クエリが原因で日本語入力の一文字目が勝手に確定する

Excelのテーブルに行や列を挿入する際のエラー

オカムラ家具のOAチェアー、コンテッサを分解清掃

突然滅茶苦茶遅くなったPCがWindows Updateのキャッシュクリアで復活

ChatGPTが日本語からVBAのコードを生成できてたまげる

Windows セキュリティーのビックリマークが消えない

Power Automate Desktopでブラウザでダウンロードしたファイルを処理する

Excel VBAからODBCを使ってデータを簡単に取得する