
コンピュータグラフィックスにおいて、パレットとは、画像を作成するために使用できる色の集合のことです。システムによっては、パレットはハードウェア設計によって固定されていますが、他のシステムでは動的であり、通常はカラールックアップテーブル(CLUT)を介して実装されます。CLUTは、特定の色空間の色再現範囲から選択された色にインデックスが割り当てられ、そのインデックスによって色を参照できる対応表です。この手法では、色空間内の実際の色を記述するのに必要な情報よりも少ない情報で色を参照できるため、処理、転送帯域幅、RAM使用量、ストレージなど、データ使用量を削減することを目的としています。CLUTへの参照によって色が示されている画像は、インデックスカラー画像と呼ばれます。
2019年現在、グラフィックスカードで最も一般的な画像カラースペースは、ピクセルあたり8ビットの色深度を持つRGBカラーモデルです。この手法では、ピクセルあたり8ビットを使用して各RGBチャネルの輝度レベルを記述するため、24ビットで各ピクセルの色を完全に記述できます。したがって、このようなハードウェアのシステムパレット全体では2 24色になります。CLUTを使用してより小さなパレットを使用する目的は、一度に処理する可能性のある色のセットを減らすことによって(多くの場合、適応的な方法を使用して)、ピクセルあたりのビット数を減らすことです。各可能な色にはインデックスが割り当てられ、色を完全に記述するために必要な情報よりも少ない情報を使用して各色を参照できます。例として、GIFファイル形式で一般的に使用される256色パレットがあります。これは、画像を表現するために使用する256色を24ビットカラースペース全体から選択し、それぞれに8ビットのインデックスを割り当てます。この方法により、システムは(256色の制限が許す限り)RGB色空間内のあらゆる色を再現できる可能性がある一方で、ピクセルあたりのストレージ要件は24ビットから8ビットに削減されます。
画面上にモザイク状に多数の異なる画像サムネイルを表示するアプリケーションでは、プログラムがすべての画像サムネイルの適応型パレットを同時にハードウェアカラーレジスタに読み込むことができない場合があります。解決策としては、あらゆる種類の画像を適切な精度で表示できる、共通のマスターパレットまたはユニバーサルパレットを使用することです。
これは、マスターパレットが完全なRGB カラースペースを「縮小」した形で構成し、赤、緑、青の各成分が持つことができるレベルを制限するように色を選択することによって行われます。この種の配置は、均一パレットと呼ばれることもあります。[ 1 ]人間の目は、 3 つの原色に対して異なる程度で感度を持っています。緑が多いほど、青は少なくなります。そのため、RGB 配置では、緑の成分に多くのレベルを割り当て、青に少ないレベルを割り当てることで、この特性を利用できます。
このように構築されたマスターパレットには、最大で8R×8G×4B = 256 色まで格納できますが、これでは予約色、つまりプログラムが特別な目的で使用するカラーインデックスのためのスペースがパレットに残されません。より一般的なのは、6R×6G×6B = 216 ( Web カラーの場合と同様)、6R×8G×5B = 240、または6R×7G×6B = 252のみを使用することです。これにより、予約色のためのスペースが確保されます。
次に、画像サムネイル(またはその他の異種画像)のモザイクを読み込む際、プログラムは元のインデックス付きカラーピクセルをマスターパレット内の最も近い色にマッピングし(これをハードウェアカラーレジスタにダンプした後)、その結果をビデオバッファに書き込みます。以下は、240個のRGB色と16個の中間グレー色からなるマスターパレットを使用した、4つの画像サムネイルの単純なモザイクの例です。すべての画像は、色の精度を大きく損なうことなく合成されます。
インデックスカラー技術を用いる場合、適応型パレット(アダプティブパレットとも呼ばれる)を使用することで、実写画像を真のカラーのオリジナル画像により忠実に再現できます。このパレットでは、アルゴリズムを用いてオリジナル画像から直接色を選択または量子化します(最も頻繁に出現する色を選択するなど)。このようにして、さらにディザリング処理を加えることで、インデックスカラー画像はオリジナル画像とほぼ一致するようになります。
しかし、これは画像ピクセルとその適応型パレットとの間に強い依存関係を生み出します。8ビット深度のグラフィックディスプレイを想定すると、画像サーフェス自体をフレームバッファにロードする前に、特定の画像の適応型パレットをカラーハードウェアレジスタにロードする必要があります。異なる適応型パレットを持つ異なる画像を表示するには、スライドショーのように、画像を1つずつロードする必要があります。以下に、それぞれの(そしてほとんど互換性のない)適応型パレットを示すカラーパッチ付きの、4つの異なるインデックスカラー画像のサンプルを示します。
インデックス付きカラー画像内の単一のパレットエントリを透明色として指定することで、シンプルなビデオオーバーレイを実行できます。ビデオオーバーレイとは、特定の画像を背景画像の上に重ね合わせ、重ね合わせた画像の一部が背景を覆い隠し、残りの部分は覆い隠すようにする処理です。映画やテレビ番組のタイトルやクレジットの重ね合わせは、ビデオオーバーレイの典型的な応用例です。
重ね合わせる画像(インデックスカラーを想定)では、特定のパレットエントリが透明色の役割を果たします。通常はインデックス番号0ですが、ソフトウェアでオーバーレイを実行する場合は他の番号を選択することもできます。デザイン時には、透明色のパレットエントリに任意の(通常は特徴的な)色が割り当てられます。以下の例では、ポインティングデバイス用の典型的な矢印ポインターがオレンジ色の背景上にデザインされているため、オレンジ色の領域が透明領域を示しています(左)。実行時には、重ね合わせた画像が背景画像の任意の場所に配置され、ピクセルカラーインデックスが透明色の場合は背景ピクセルが保持され、そうでない場合は置き換えられるようにブレンドされます。
この技術は、ポインター、典型的な2Dビデオゲームにおけるキャラクター、弾丸など(スプライト)、ビデオのタイトル、その他の画像合成アプリケーションなどに使用されます。
初期のコンピュータ、例えばCommodore 64、MSX 、 Amigaなどは、ハードウェアによってスプライトやフルスクリーンビデオオーバーレイをサポートしていました。これらの場合、透明パレットのエントリ番号はハードウェアによって定義され、以前は0でした。
GIFなどの一部のインデックス付きカラー画像ファイル形式は、特定のパレットエントリを透明として指定することをネイティブにサポートしており、特定の画像に使用されるパレットエントリの中から自由に選択できます。BMPファイル形式は、 カラーテーブルにアルファ チャンネル値用の領域を確保していますが、[ 2 ]現在この領域は半透明データを保持するために使用されておらず、ゼロに設定されています。対照的に、PNG はパレットエントリのアルファ チャンネルをサポートしており、パレット画像で半透明を実現できます。
トゥルーカラー画像を扱う場合、一部のビデオミキシング機器では、透明色としてRGBトリプレット(0,0,0)(赤、緑、青なし:最も暗い黒色で、この文脈ではスーパーブラックと呼ばれることもあります)を使用できます。デザイン時には、いわゆるマジックピンクに置き換えられます。同様に、一般的なデスクトップパブリッシングソフトウェアでは、写真やイラストから純粋な白、RGBトリプレット(255,255,255)を除外して、テキスト段落が画像の境界ボックスに侵入し、画像の被写体の周囲に不規則なテキスト配置ができるようにします。
Microsoft PaintやDeluxe Paintのような2Dペイントプログラムでは、切り取り、コピー、貼り付け操作を行う際に、ユーザーが指定した背景色を透明色として使用することができます。
画像ビットマスクとアルファチャンネルは、同じ目的で使用されるため関連性はあるものの、パレットや透明色を一切使用せず、画像からバイナリデータレイヤーを追加する技術である。
Microsoft Windowsアプリケーションは、Win32 APIの専用関数を使用して、4 ビットまたは 8 ビットのインデックスカラー表示デバイスのパレットを管理します。HighcolorおよびTruecolor表示モードでは、パレットの適用性が問題となる場合があります。これらの API は、いわゆる「システムパレット」と多数の「論理パレット」を扱います。
「システムパレット」とは、カラーディスプレイのハードウェアレジスタ(主に物理パレット)をRAM上にコピーしたものであり、システム共通の固有リソースです。起動時には、デフォルトのシステムパレット(主にほとんどのプログラムで十分に機能する「マスターパレット」)が読み込まれます。
あるアプリケーションがカラーグラフィックや画像を出力しようとする場合、独自の「論理パレット」、つまり独自のカラー選択(最大256色)を設定できます。アプリケーションが画面上に表示しようとするすべてのグラフィック要素は、その論理パレットの色を使用することが前提となります。各プログラムは、事前に想定される干渉を受けることなく、1つまたは複数の論理パレットを自由に管理できます。
出力が実際に作成される前に、プログラムは論理パレットを認識する必要があります。システムは「論理」色と「物理」色を照合しようとします。目的の色が既にシステムパレットに存在する場合、システムは論理色をシステムパレットのインデックスに内部的にマッピングします(両者が一致することは稀であるため)。目的の色がまだ存在しない場合、システムは内部アルゴリズムを適用して、システムパレット内で最も使用頻度の低い色(通常はバックグラウンドで別のウィンドウが使用している色)を破棄し、新しい色に置き換えます。システムパレットには色の格納スペースが限られているため、このアルゴリズムは類似の色をまとめて再マッピングしようとし、常に冗長な色の作成を回避します。
最終的な結果は、同時に画面上に色を表示しようとするアプリケーションの数によって異なります。常にフォアグラウンドのウィンドウが優先されるため、バックグラウンドのウィンドウは、破損したり、すぐに再描画されたりと、さまざまな動作をする可能性があります。システムパレットが変更されると、システムは特定のイベントをトリガーして、すべてのアプリケーションに通知します。このイベントを受信すると、ウィンドウは単一のWin32 API関数を使用してすぐに再描画できます。ただし、これはプログラムコードで明示的に行う必要があります。そのため、多くのプログラムはこのイベントを処理できず、この状況でウィンドウが破損してしまうのです。
アプリケーションは、システムパレットに特定の色(特定の順序でも)を強制的に読み込むことができます。これは、それらがアニメーション(物理パレットの特定のエントリにおける色の素早い変化)を目的とした色エントリであるとシステムに伝えることで、システムを「だます」ことになります。するとシステムは、それらのハードウェアパレットエントリがパレットの色管理アルゴリズムで使用できなくなったと判断します。最終的な結果は、色を強制的に読み込むプログラムの性能、他のプログラムの動作(ただし、この問題は通常の場合と同じです)、そしてオペレーティングシステム自体の動作に依存します。