インデックスカラー

インデックスカラー: indexed color)とはビットマップ画像の一種。画素(ピクセル)ごとに色を直接指定するのではなく、カラーマップと呼ばれる色定義テーブルの参照番号を指定して画像を表現する形式。

概要

[編集]

ロゴマークなどのデザイン画の場合、1枚の画像の中で使用されている色の数が限られていることが多い。この場合、あらかじめ使用している色を「色番号1は赤30%・緑20%・青40%、色番号2は赤4%・緑92%・青8%、…」のように色番号で定義しておき、画素ごとのデータとしてはこの色番号を指定するようにすれば、高い色解像度を持ちつつデータ量を大幅に抑えることができるようになる。このような色表現のことを「インデックスカラーindexed color)」と呼ぶ[注釈 1]。対して、画素ごとに直接色を指定する方式は「トゥルーカラーtrue color)」または「フルカラーfull color)」と呼ばれる。

インデックスカラーの色番号と実際の色の対応を定義する表は「カラーマップcolor map)」、「カラールックアップテーブルcolor lookup table)」または「カラーパレットcolor palette)」と呼ばれる。例えば、カラーマップの大きさが4色分だと、各画素に必要なデータは2ビット、16色だと4ビット、256色だと8ビットなどのようになる。CPUデータ処理の単位として8ビットがよく用いられることから、256色のインデックスカラーが最もよく用いられている。コンピュータの性能が低かった時代では、メモリ容量だけでなく同時発色数にも限界があり、モノクロでは2色や4色、カラーでは8色や16色の画像形式もよく使われていた[1]

色番号から実際の色に変換する作業をハードウェア(ビデオ出力回路)で行なうことができるようになっていることが多い。この場合、あらかじめカラーマップをビデオ出力回路の特別な部分に書き込んでおけば、少量の画素データを転送するだけで画像が表示できるので高速な描画が可能となる。

例えば、近年[いつ?]のコンピュータ画像の主流である色表現は赤・緑・青それぞれに8ビットずつ、合計24ビット=3バイトメモリを必要とするものであるが、これをVGAモードで表現するためには640×480×24=7,372,800ビット=900KiBになる。8086などの昔のパソコンに使われているCPUではこれほどの大きさのデータでは転送するだけでかなりの時間がかかってしまい、また半導体も高価で実装は現実的ではなかった。一方、8ビットインデックスカラーだとデータ量はこの3分の1になり、現実的に実装できる量になる。

パレットアニメーションの例

ハードウェアによるカラーマップ変換機能があれば、情報量の多い画素データを変更せずに情報量の極めて少ないカラーマップだけを変更することにより表示色をきわめて高速に調整することができる。また、これを利用して高速な画像切り替えを実現することもできる。例えば、色番号1に白を、それ以外の色番号には全て黒を割り当てておくと、色番号1で描いた図形だけが目に見えるが、これを色番号2に白を、それ以外の色番号には全て黒を割り当てた別のカラーマップに切り替えると、描画している画素を全く書き直すことなく、色番号2で描いた図形に変化させることができる。この手法は「パレットアニメーション」と呼ばれ、主に容量やハードウェア性能に制約のあるゲームプログラムで爆発の閃光をすばやく明滅させたい場合などによく用いられていた手法である[注釈 2]

インデックスカラーは、その原理上、自然画像のような大量の色を使用する画像を扱うことは難しいが、色のはっきりしたロゴや非リアリスティックなイラストレーションでは画像ファイルの大きさを抑えることができるため、現在でも広く使用されている。Web用の画像として多く使われているGIF形式の画像フォーマットはインデックスカラーである[注釈 3]

トゥルーカラー形式の画像をインデックスカラー形式の画像に変換することは減色処理と呼ばれる。元々膨大な色数を含む自然画像を、人間の目にできるだけ劣化を感じさせずに色数を減らすための高度な処理が必要となる。

ハードウェアでカラーマップの処理を行なっている場合、複数のインデックスカラー画像を同時に表示する場合には、両方の画像で使用している色を網羅したカラーマップを合成し、各画像の画素データをそれに合わせて調整するという作業が必要になる。

インデックス画像のカラーマップのうち1色を透過色(クロマキー)として利用することも多い。GIF、PNGはクロマキーをサポートする画像ファイルフォーマットである。

PCとインデックスカラー

[編集]

既述の例では、指定可能な色数が、実際に情報を持つ色数を上回っているケースとそのメリットについて説明されているが、初期のコンピュータであるPC-8801等でも「パレット機能」として、表示色を指定することが可能な機能が実装されている。これは、前述のパレットアニメーションのような用法以外に、グラフィックスプレーンが3プレーンで構成され、各々がR.G.B.の要素を持つ形で、8色での表示を実現しているものの、「白」で描画する場合、そのすべてのプレーンの該当部分のビットを立ててやる必要があり、赤、緑、青などのプレーンそのものが示す色に対し、最大3倍の処理を要することになる。使用頻度が高い色のうち、負荷の高い色を負荷の低いパターンと入れ替えることにより、描画処理の軽減を行うことも可能であった。

パーソナルコンピュータ (PC) では1985年以降のNECのPC-9801シリーズにおいて、ハードウェアによるインデックスカラー(4,096色中16色同時表示)が採用された。最も基本的な白や黒も自由に変更できたので、メニューの文字が読めなくなるというような事態も発生した。Macintoshの初期のカラー対応機ではソフトウェアによるインデックスカラーが行われた。これは画像領域だけを描き直すというもので、リアルタイムにコントロールできなかった。なおNECの初期のWindows PC(PC-9821シリーズ、256色同時表示)でもソフトウェアによるインデックスカラーが行われていた。

脚注

[編集]

注釈

[編集]
  1. ^ 疑似カラーpseudo color)」という語が使われることもあるが、疑似カラーとはふつう、本来モノクロームである画像に対して形状識別などの利便性のために虹色等の人工彩色を施した画像のこと(pseudo-color)である。なお疑似カラーの実装をインデックスカラーによって行うことは可能であるし多用されている(インデックスカラーによるモノクロ画像で、各インデックスに対応する色を差し替えれば良い)。もし「疑似」という語をインデックスカラーの意で使うならば、擬似フルカラー(pseudo full-color)とでもしたほうがよい。
  2. ^ プログラマブルシェーダー機能をサポートする近代的なGPUであれば、ピクセルシェーダープログラムを記述して同様のパレットアニメーション処理をソフトウェアにより実現することもできる。
  3. ^ GIFはアニメーション機能(GIFアニメーション)を古くからサポートしていたこともあって、色数の制約があるにもかかわらずAPNGよりも普及している。

出典

[編集]

関連項目

[編集]