2次元グラフィックスのはなし
コンピュータのディスプレイは,CRT(Cathode Ray Tube)のころから,小さな光を発する点(画素)の集まりを用意して,それぞれ点けたり消したりすると,ある場合は,文字に見えたり,画像に見えたりするという原理にに基づいています。
例えば,横5縦7のLEDを並べて
〇●●●〇
●〇〇〇●
●〇〇〇●
●〇〇〇●
●●●●●
●〇〇〇●
●〇〇〇●
というように光らせる(●点灯〇消灯)と'A'と見えるわけです。
(ドットマトリックスアルファベット)
この原理でもっとLEDを増やせば,漢字を表現できますし,さらにはいろいろな図形を表示できます。
さて,この場合,左上隅から横にx個目下にy個目とLEDの位置を(x,y)と表すことにするとよいでしょう。そして上のパターンの一行目なら
(1,1) OFF
(2,1) ON
(3,1) ON
(4,1) ON
(5,1) OFF
と表すのです。
※コンピュータの世界では,数えるときに0からはじまることが多いのですが,ここでは1からはじまることにしています。
さて,この光の状態をメモリに格納するにはどうすればよいでしょうか?
一個の光の点の点灯・消灯のパターンを表すのには1ビットあればよいです。
上の場合,5ビット単位では扱いにくいので,1行を8ビットで表し,7ビットで表します。
例えば2進数表示で
0111000
1000100
1000100
1111100
1000100
1000100
と表します。(最下位の2ビットは隙間を埋めるため常に0にしています。)
16進数表示すれば
70
88
88
88
F8
88
88
です。
さて,フルカラーディスプレイでも,原理は同じなのですが,一つの光の点(画素)がRGBの色成分から成っており,一つの画素が24ビット(3バイト)で表されます。
フルカラーのビットマップデータは基本は,3バイトのデータの列が並んだデータです。
ただ,たとえば,60画素は横5縦6なのか横6縦5なのか横60縦1かなどなどいろいろ考えられるので,縦と横の画素数を記録したり様々な補助情報が必要となり,画像ファイルの先頭に54バイト使われています。
さらに3バイトというのは扱いづらいので32バイトを単位とします。そのため横の画素数が4の倍数でないと半端が出てしまうので,隙間を1から3バイトで埋めます。
このため,16x15のビットマップとと15×16のビットマップのデータのサイズは異なります。横が16ビットでは無駄がないのですが,横が15だと45バイトのデータを48バイトで表すので3バイトずつ無駄が出るのです。(ペイントで簡単に作って確認してみましょう)
15x16フルカラービットマップのサイズ 822
15x16フルカラービットマップのサイズ 774
各行に3バイトずつ16行あるので48バイト無駄が出ています。
この記事が気に入ったらサポートをしてみませんか?