ぴぐノート

Good code is its own best documentation.

雑記

ポイント(pt)からピクセル(px)への変換:DPIについて

投稿日:

写真などの画像ファイルやPDFなどの文書ファイルを扱う際に知っておくこととして、ポイントピクセル、そしてDPI(Dot Per Inch:1インチあたりのドット数)があります。
ライブラリなどを使う場合、画像のファイルサイズ取得関数を呼ぶと、ポイントとして返ってくることもあるため、こういった単位については知っておくと、「思った通りのサイズにならない…。」という場合にも困りません。

また画像を出力する場合にはピクセルとして指定する必要があるため、ポイントからピクセルへの変換は重要です。

そしてもう一つ、DPIについても知識が必要になるかもしれません。
DPIとは「1インチ(1平方インチではありません)の幅の中にどれだけのドットを表現できるか。」という指標です。
コンピューターのディスプレイなどでは72~96DPIを想定されることが多いですが、印刷物などでは最低でも300DPIが必要となります。
DPIの数値が大きくなればなるほど、美しく、視認性が高くなります。

ポイントからピクセルへの変換

まずは結論からいきましょう。
ポイントからピクセルを導きたい場合は、以下の式で算出できます。

ピクセル(px) = ポイント(pt) / 72 * DPI

プログラム上では除算が含まれるため、ポイントやピクセルはdouble、もしくはfloatなどで取得しておくと、不都合が少ないかと思います。

“72”ってなに?

算出する際の除数(割る数)、”72″とは何でしょうか。
これはDTP(DeskTop Publishing:デスクトップパブリッシング)と言われる、書籍などの出版物をコンピュータ上で作成する際における定義で、

1ポイント = 1 / 72インチ

という定義によります。
2ポイントなら「2/72インチ」、12ポイントなら「12/72インチ」、72ポイントなら「72/72インチ」となります。
そのため、96DPIで72ポイントサイズをピクセルに変換する場合、px = 72 / 72 * 96 = 96(px)と算出できます。

プログラミングでは?

さて、冒頭でも少し触れましたが、コーディングする際には変数をdoubleで宣言した方が無難です。
例えば、

上記サンプルコードを実行すると、
96(px) : 100 / 72 * 96
と、おかしな結果になりますね。

「表示する関数ではint型を求められるから」、とポイントもintで宣言してしまうと、小数点以下の切り捨てにより結果にかなり差が出てきます。
キャストなどで回避することは可能ですが、計算はdoubleで行い、実引数として値を渡すときにint型にキャストするのがいいでしょう。

結果は、
133.333(px) : 100 / 72.0L * 96
となり正しい結果が得られました。

まとめ

ゲーム制作の場合ではDPIなどを気にすることはあまりありませんが、その分三角関数などを使うことが多いのでやはりdouble型変数として保持しておき、出力の際にキャストという方法がとられることも多いです。
写真の加工や文書ファイルの表示などでこういった知識を持っていると、手が止まることなくコーディングが進められるのではないでしょうか。

 

スポンサーリンク

スポンサーリンク

-雑記

執筆者:

関連記事

第2新卒やフリーターが未経験からプログラマになるには無料のITスクール!

私が働いている会社でもちょくちょく面接希望の電話がかかってきます。 業界全体として人手不足と言われるコンピューター業界なので、未経験であっても学習意欲が感じられたり何か自分で物づくりを経験していれば、 …

Windows標準コマンドプロンプトを使って自動採番してみよう!

Windowsのエクスプローラーには自動採番機能があることは、IT関連に勤めていなくてもご存知の方も多いのではないでしょうか。 同じファイル名を付けようとすると、「”pigs &#8211 …

整備済みiPhone 6sが米Apple storeで販売開始。

米Appleの公式オンラインショップ、Apple storeで整備済iPhoneの取り扱いを開始しました。 全てSIMロックフリーモデル、バッテリーは新品の状態で価格は新品よりも15%OFFとなり約1 …

C++のプリプロセッサの復習をしよう その1

C++を勉強していた時期から苦手だったのがプリプロセッサでした。 インクルートガードに#ifndefやら#defineやら#pragma onceやら…。 C++に限った話ではありませんが …

【将棋】電王トーナメントはPonanzaが優勝。叡王戦は羽生善治九段がベスト4に。

将棋の電王トーナメント、叡王戦、そして電王戦はご存知でしょうか。 コンピューターの将棋ソフトで最強を決める電王トーナメント、その最強将棋ソフトとの対戦者を決める叡王戦、そして最強将棋ソフトと叡王戦優勝 …