GDIに役立つものはありません。マイクロソフトにとっては、索引付けされたイメージがあまりにも後方の技術であるようです。できることは、インデックス付きのイメージファイルを読み書きすることだけです。
画像の色を量子化するときに、2つのステップが通常あります
1)画像に最適なパレットを探す(カラー量子化)
2)見つかったパレット(カラーマッピングにソースsolors地図)
私が理解していることから、あなたはすでにデータベースにパレットを持っています。つまり、最も難しい部分があなたのために行われました。 24ビットカラーを指定されたパレットカラーにマップするだけです。開始パレットがない場合は、量子化アルゴリズムを使用して自分で計算する必要があります。OctreesまたはMedian Cutが最もよく知られています。メディアンカットはより良い結果をもたらしますが、実装するのがより遅くて難しく、細かく調整します。
色をマッピングするには、ソースカラーからすべてのパレットカラーまでの距離を計算し、最も近いものを選択するのが最も簡単なアルゴリズムです。青が少ない重量を持つように
float ColorDistanceSquared(Color c1, Color c2)
{
float deltaR = c2.R - c1.R;
float deltaG = c2.G - c1.G;
float deltaB = c2.B - c1.B;
return deltaR*deltaR + deltaG*deltaG + deltaB*deltaB;
}
また、特に30/59/11がまったく動作しません、他のそれは恐ろしい結果が得られますが、それにあまりにも船外に行っていない、チャンネルをponderateことができます。
float ColorDistanceSquared(Color c1, Color c2)
{
float deltaR = (c2.R - c1.R) * 3;
float deltaG = (c2.G - c1.G) * 3;
float deltaB = (c2.B - c1.B) * 2;
return deltaR*deltaR + deltaG*deltaG + deltaB*deltaB;
}
すべてのソースとパレットの色についてそのものを呼び出し、最小値を見つけます。地図を表示しているときに結果をキャッシュすると、非常に高速になります。
また、元の色は、バンディングやプレーン領域が作成されず、画像の細部が失われないようにパレットカラーに適合することはめったにありません。これを避けるために、ディザリングを使用することができます。最も簡単なアルゴリズムと最良の結果をもたらすアルゴリズムは、誤差拡散ディザリングです。
色をマッピングしたら、ビットマップを手動でロックし、そこにインデックスを書き込む必要があります.Netでは、インデックス付きイメージに書き込むことはできません。
+1、素敵な質問! –