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バイト無駄が出ています。


この記事が気に入ったらサポートをしてみませんか?