ビットマップ画像
ビットマップ画像とは、コンピュータグラフィックスにおけるの表現形式で、ピクセル(画素)を用いたもの。画像をドットマトリクス状のピクセル群として捉え、RGB等の表色系に基づいたピクセルの色・濃度の値の配列情報として取り扱う。
ラスタ画像とも呼ばれ、これに対し幾何図形を作成するための情報を数値や式として表現したものをベクタ画像と呼ぶ。
元々は、2値の画像情報を格納した初期のフレームバッファとその内容である画像情報をビットマップと呼んだ。2値の画像はピクセルあたり1ビットの情報量で記録されており、ディスプレイのピクセル配置とメモリのビット配置が1対1で対応(マッピング)することから「ビットマップ」と呼んだのである。
ビットマップの利用はコンピュータ用ディスプレイシステムの発展と歩を同じくする。1960年代までのグラフィック用コンピュータでは、メモリ容量および価格の制限から、短い走査描画命令によるディスプレイリストで画面内容を保持できるベクタースキャン式CRTを利用したシステムが主流であり、そこで扱われる画像はベクタ形式であった。他方、テレビで既に利用されていたラスタースキャン式CRTは、ディスプレイ自体は安価であり、塗り潰し表現や写真など複雑な模様も瞬時に表示可能な点でグラフィック表現に優れたが、コンピュータで利用するには比較的大容量なピクセル配列(ビットマップ)で画面内容を保持するフレームバッファメモリが必要であり、当時のメモリ技術および経済性においては限界があり、『NLS』など研究目的の実装に留まっていた。1970年代に入って、メモリの大容量・低廉化が進むことで、フレームバッファメモリおよびラスタースキャン式CRTなどのビットマップ・ディスプレイを組み合わせたシステムが一般に実用化されて主流になり、1977年にはApple IIなどパーソナルコンピュータでも変則的ながらカラービットマップが使われるようになった。もっとも、初期のシステムではピクセルあたり1ビットの表現が用いられたことから、前記の理由でフレームバッファメモリとその内容が「ビットマップ」と呼ばれるようになり、ピクセルあたり多ビットの表現が標準的な現在も呼称として残っている。
現在はピクセルを用いた画像表現全般を指す用語として「ビットマップ」が広く使われているが、より狭義な技術用語としては、「ビットマップ」の用法をモノクロ2値画像に限定し、カラーやグレースケール階調画像を含める場合はピクセルマップ、ピクスマップ(pixmap)と呼ぶこともある。
ラスター表現(raster representation)は、2次元画像を表現する方式のひとつである。点が線状に並んだもの(ラスター線)を平行に並べた面として画像を表現する。「raster」とは、熊手のようなもので面を線状になぞる事を意味し、ブラウン管で画像を表示する時の走査線の様子から、その表示領域もそう呼ぶ。ラスター表現では多くの場合、画像の表現精度がディスプレイの表示能力と標本化定理に左右され、特に低解像度ではエイリアシング現象によるジャギーと呼ばれる階段状のギザギザが現れる。ラスター表現による画像は「ラスターイメージ」あるいは「ラスターグラフィックス」と呼ぶ。
ビットマップ画像は、コンピュータでラスター表現を処理する形式であり、デジタルなラスターイメージの一種である。狭義のビットマップ画像(上記の白黒画像やWindows bitmap)と区別する意味で、ラスターイメージと呼ぶ方が正確であると主張するものもいる。
ピクセルの集まりに過ぎないラスター表現では幾何図形を直接表現することはできず、ベクターイメージを「ラスタライズ」または「スキャン変換」と呼ばれる処理によってラスターイメージに変換する必要がある。例えば、良く知られた線分のラスタライズ法のひとつにブレゼンハムのアルゴリズムがある。一般的なコンピュータシステムでは、ラスタライズ処理はグラフィックスAPIのソフトウェアやGPUハードウェア、プリンターが内蔵するラスターイメージプロセッサ(RIP)によっておこなわれる。なお、3次元コンピュータグラフィックスなど、ラスタライズ工程を部分として含むのみ(例えばOpenGLやDirect3Dのグラフィックスパイプラインなど)の場合では、画像処理全体は「レンダリング」と呼ぶことが多い。
ビットマップとは本来ラスターイメージをシステムに実装する技術を意味する。初期のコンピュータはモノクロ2値でしかCRTに表示できなかったので、英数フォントは余白を含めて8×16ドットでデザインされていた。その文字をディスプレイ上に80文字25行表示するために、最低640×400ドット(画素)が必要であった。フォントの1ドットをそのままバイトデータの1ビットに割り当てると都合がよかったので、その割り当て表が「ビットマップ」と呼ばれた。すなわち1画面をモノクロで表示するには、80×16×25=32,000バイトあれば足りたのである。
その後カラー表示を実現するに際して、モノクロ表示と上位互換性を保つために、モノクロ1画面のビットマップをそのまま「プレーン」という新しい概念にあてはめ、プレーンを増やすことでカラー化を果たすことになった。そのとき3プレーンで8色、4プレーンで16色という基本的な仕組みが出来上がった。その当初はアプリケーションからプレーンのビットマップに直接データを送り込むことができたが、やがて8プレーン(256色)以上のVRAMはフレームバッファと呼ばれ、本体のRAM空間とは独立した存在となり、APIを経由しなければビットマップを操作できなくなった。ちなみにディスプレイの表示モードに16色や256色が残っているのは、過去のOSとミニマムな互換性を維持するためである。また同じフレームバッファに複数の表示モードが用意されているが、これは例えば640×480×32ビットと同じメモリ空間に、1280×960×8ビットを割り当てることができることによる。このようにマッピングの変更によって複数の画素数、色数を選択できるところにビットマップの巧妙な仕組みがある。
なおWindowsにはBMPという保存形式があるが、これはAPIからフレームバッファ(または仮想フレームバッファ)のビットマップを読み込み、そのまま保存する形式で、ラスターグラフィックの低水準保存形式である「ベタ画像」形式やRAW画像形式とは、全く異なる内容である。その意味からも「ラスターイメージ」を「ビットマップイメージ」と言いかえるのは適切ではない。
ラスター表現においては画素(ピクセル)という概念が必要となる。1画面は「ライン(行)」と「カラム(列)」に分解でき、その最小単位が画素である。ラスタースキャン方式をとるディスプレイでは、垂直方向の1スキャンがそのまま1ラインとなるが、水平方向の解像度はデバイスの性能に依存する。そのため初期のディスプレイでは、1画素のアスペクト比(縦横比)が1対1とならず、ソフトウェアで補正することがあった。PC/AT互換機が普及してからは、その標準表示画素数である640×480がVGA規格として定着し、アスペクト比も1対1であることが当然となった。
カラー画像の場合、1画素の色深度はコンピュータが処理しやすい24ビット(RGB各8ビット)が標準だが、アプリケーションによってはさらにアルファチャンネルとして8ビットを加えてマスキングや半透明処理を行うことができる。濃淡情報のみを扱うグレースケール画像の場合、1画素あたり8ビットが標準である。商業印刷用途や産業・科学技術計算用途では、RGB各16ビットを割り当てる48ビットカラーや、16ビットグレースケールもよく使われる。ただし、いずれの形式も、コンピュータで効率的に扱えるように1スキャンラインのサイズが4バイトの倍数となるよう、必要に応じて詰め物(パディング)が末尾に付加されることが多い。
画素という用語はしばしばドット(dot、点)と混同されるが、初期のビットマップは画面表示そのままのイメージであったので、データもVGAにおいては640×480が基本となったことによる。現在では画面の表示能力の、数倍もの巨大な画素数のイメージを処理することは珍しくなく、「画素=画像データの最小単位」「ドット=グラフィックデバイスの最小単位」という理解がようやく広まってきた。
ビットマップ画像は、上記のラスター表現の考え方から、最初に表示が開始される画面左上を座標原点とすることが圧倒的に多い。水平方向をX座標、垂直方向をY座標とし、特定の画素の位置を (x, y) のように表現する。すなわち、VGA画面では左上隅が (0, 0) であり、右下隅が (639, 479) となる。この座標情報はアプリケーションにおいて画像の一部領域の切取りや移動など、編集操作のときに使われる。
一方、ベクタ形式の画像では数学的な座標と同じく左下を座標原点としているものが多くある。画像の描画を行なうAPIでは、ビットマップ画像を主に考えているか、ベクターイメージを主に考えているかによって座標の考え方が大きく変わることがある。
左下を原点とするビットマップの代表例として、Windows bitmap (BMP) がある。これも数学的な座標を意識して設計されたものである。
ビットマップ画像では、グラフィックデバイス(ディスプレイ、プリンタ)の縦方向、横方向それぞれに、1インチ単位あたりに何ドット分のデータがあるかによって、データのきめの細かさが変わる。このドットの密度を解像度と呼び、単位dpiを使って表す。
1ドットで表現できる色数は、色深度(1ドットあたりのビット数)か、色分解能(輝度の間隔)で表す。
ビットマップ画像のデータは画素一つ一つに対して色情報を持つが、色を直接データとして持つのではなく、あらかじめ決められた少数の色の番号を画素毎のデータとすることにより、データ量の大幅な削減をはかることがある。このような色指定の方法を、インデックスカラーと呼ぶ。
ビットマップ画像の各画素のデータは、基本色の色の強さの組み合わせであることが多い。光の3原色である赤・緑・青で色を表現している場合、理論的には全てが0%の時に黒、全てが100%の時に白となるはずであるが、画像を表示・印字するデバイスの特性によりそうならないことがしばしば発生する。例えば、赤の発光体だけが若干強めであり、全て100%の色を表示しようとしたら薄く赤みがかってしまったなどということが起こる。
このような際には、表示の直前で各基本色の強さを調整して「白は白で表示する」ように補正をかけることが行なわれる。この補正操作のことを「ガンマ補正」と呼ぶ。また、ガンマ補正に必要なパラメータ(つまり「赤は緑よりも○○%弱くする」など)のことを「ガンマ特性」または「ガンマ値」と呼ぶ。ガンマ補正処理を行なうことを、画像処理の分野に携わる人たちはしばしば「ガンマをとる」「ガンマをかける」と表現する。
さらに、表示デバイスなどは色の強さの再現が直線的ではなく、「50%の強さの赤を指示したのに100%の赤の半分の光量になっていない」ということがしばしば発生する。これはデバイスの特性ばかりではなく、ディスプレイなどが設置された環境に依存することも多く、デバイス自身があらかじめ完全に補正することは困難である。
このため、表示上の色の再現性に特に留意する場合には、各基本色毎にデータ上の色の強さをデバイス上の色の強さに変換するための表を用意することがある。これはデータ値と表示光量の相関を示した曲線グラフとして示されることが多いため、このパラメータを「ガンマグラフ」と呼ぶことがある。また、上記「ガンマ特性」「ガンマ値」という言葉でこの表パラメータを指す事も多い。
スキャナで写真をデジタルデータ化し、プリンタでそれを印刷する際などには、スキャナとプリンタそれぞれのガンマ特性を考慮してガンマ補正を行なわないと、元の写真と同じ色を再現できない。このため、画像データの中にスキャナなどのガンマ特性を付加情報として保存しておくということが行なわれる。このように、画像データに色再現のための情報を付加することを「カラープロファイリング」(color profiling) と呼ぶ。Apple Computerが開発した「ColorSync」というシステム(規格)は、このカラープロファイリングのための規格で、現在多くのデバイスメーカなどが対応している。なお、カラープロファイリングと呼ぶ場合、単にガンマ値の情報だけではなく、どの表色系を用いて色の補正を行なうべきかといった情報も含まれてくる。
一般に、ビットマップ画像は画素1点について1~4バイト程度のデータ量を持つ。A4サイズで600dpi、1ドットあたり色解像度が24ビット(3バイト)の画像の場合、(8.27 inch × 600 dpi) × (11.69 inch × 600 dpi) × 3 ≒ 104×106 bytes ≒ 100メガバイト となり、かなり巨大なデータとなる。
このため、ビットマップ画像を外部記憶装置にファイルとして保存する場合や、通信回線で受け渡す場合には、このデータを計算処理により圧縮しデータ量を削減する。このとき、圧縮後に元のデータを完全には再現できないものを「非可逆圧縮」、全く同じデータに戻す事ができるものを「可逆圧縮」と呼ぶ。非可逆圧縮の場合には、「人間の目で見て変化ができるだけ分からないように」という指標に基づいて情報量を減らす事ができるので高い圧縮率を得ることができる。圧縮アルゴリズムにもよるが、一般的に、可逆圧縮に比べ非可逆圧縮の圧縮率が格段に高いため、色の数が多く滑らかに変化するような写真等の画像データを保存するときのフォーマットにはJPEG等の非可逆圧縮が用いられることが多い。しかし、いわゆる「ベタ塗り」部分の多いイラストやピクセルアート(ドット絵)などの画像の場合、自然画に最適化されたJPEGでは、モスキートノイズなどによる画質の劣化が目立ちやすく圧縮率もそれほど高くないため、GIFやPNG等の可逆圧縮が用いられることが多い。GIFやPNGは可逆圧縮であるが、元画像の色数が少ない場合には実用上十分に高い圧縮率を得ることができる。なお、GIFやPNG圧縮を行う際は、圧縮率を高めるためにあらかじめ適当な方法で減色操作を行う場合が多い。
ビットマップ形式からベクタ形式への変換は、その逆に比べ困難である。
ビットマップ画像からベクターイメージへの変換は、例えば手描きの図面をイメージスキャナで読み取ってビットマップ画像とし、「輪郭抽出」「細線化」「線分や領域の抽出」「線分列の曲線へのフィッティング」などの処理をソフトウェアで行うが、欠損箇所が生じやすく、必ずしも満足のいく結果が得られるとは限らない。特に元のビットマップの解像度が低い場合にこの問題が発生しやすいが、逆に解像度が高い場合には処理時間が大きくかかるという問題を生じる。また印刷物からイメージスキャナを使って文字情報を読み取るソフトウェア(OCR)でも識字率は90%程度であり、修正作業を強いられる。
代表的なビットマップ画像のには次のようなものがある。
BMP - Microsoft Windows Bitmap Image
GIF - Graphics Interchange Format
JPEG - Joint Photographic Experts Group
JPEG XR - マイクロソフトが提唱したJPEGの後継規格
PNG - Portable Network Graphics
PNM - Portable anymap
TIFF - Tagged Image File Format
XPM - X window Pixel Map
WebP - Googleが提唱した、JPEG/GIF/PNGを代替する高圧縮Web画像フォーマット
単純なファイルフォーマットでは、各ピクセルの色情報をそのままファイルに記録する。基本的にはバイナリデータだが、UNIXの画像形式であるX11 Bitmapなど、一部の形式はC言語のソースコードとして記述されるものもある。また、バイナリデータであっても、色数が多いとファイルサイズが大きくなるため、通常は圧縮を施している。このとき、同じファイルフォーマットであっても圧縮方法の差異によりいくつかの種類に分かれることがある。
コンピュータソフトウェアにおいては、ビットマップ画像を編集する(絵を描く)ためのソフトウェアは一般には「ペイントソフト」と呼ばれる。対照的に、ベクターイメージを編集するソフトウェアは「ドローソフト」と呼ばれることが多い。これは、画像編集ソフトウェアがいち早く充実していたMacintoshにおいて、ビットマップ画像を編集するソフトウェアの初期の代表格が「MacPaint」、ベクターイメージを編集するソフトウェアが「MacDraw」という名前であったことに由来する。