写真などの画像ファイルや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で宣言した方が無難です。
例えば、
1 2 3 4 5 6 |
int main() { int nPoint = 100; cout << nPoint / 72 * 96 << "(px) : 100 / 72 * 96" << endl; return 0; } |
上記サンプルコードを実行すると、
96(px) : 100 / 72 * 96
と、おかしな結果になりますね。
「表示する関数ではint型を求められるから」、とポイントもintで宣言してしまうと、小数点以下の切り捨てにより結果にかなり差が出てきます。
キャストなどで回避することは可能ですが、計算はdoubleで行い、実引数として値を渡すときにint型にキャストするのがいいでしょう。
1 2 3 4 5 6 |
int main() { double dPoint = 100.0L; cout << dPoint / 72.0L * 96 << "(px) : 100 / 72.0L * 96" << endl; return 0; } |
結果は、
133.333(px) : 100 / 72.0L * 96
となり正しい結果が得られました。
まとめ
ゲーム制作の場合ではDPIなどを気にすることはあまりありませんが、その分三角関数などを使うことが多いのでやはりdouble型変数として保持しておき、出力の際にキャストという方法がとられることも多いです。
写真の加工や文書ファイルの表示などでこういった知識を持っていると、手が止まることなくコーディングが進められるのではないでしょうか。