4


1

C#-画像を8ビットのインデックス付き画像にコピーする

通常の32ビットImageオブジェクトから8ビットのインデックス付きイメージを作成したい。

Bitmap img = new Bitmap(imgPath); // 32-bit
Bitmap img8bit = new Bitmap(imgW, imgH, Format8bppIndexed); // 8-bit

// copy img to img8bit -- HOW?

img8bit.Save(imgNewPath, ImageFormat.Png);

グラフィックスはインデックス付きイメージでは機能しないため、SetPixelを使用してピクセルごとにコピーすることはできません。

他には?

2 Answer


5


ビットマップをパレット化された(8ビット)イメージに変換するhttp://www.wischik.com/lu/programmer/1bpp.html[C#ライブラリ]を見つけました。 GDI32(Windowsグラフィックスシステム)を直接呼び出すため、この手法は高速です。

グレースケールパレットで8bpp(パレット化)画像に変換するには、次のようにします。

System.Drawing.Bitmap b0 = CopyToBpp(b,8);

別のパレットを使用して画像に変換する場合は、CopyToBppのソースコードのコメントを参照してください。 1bppまたは8bppのパレット化コピーに変換する場合、Windowsは各ピクセルを1つずつ見て、そのピクセルに最も近いパレットエントリを選択することに注意してください。 ソース画像とパレットの選択に応じて、パレットで使用可能な色の半分のみを使用した結果の画像になることがあります。


1


任意のRGBA画像を8ビットのインデックス付きビットマップに変換するのは簡単な操作ではありません。上位256色を決定して残りを丸める(またはディザリングなどを行う)ために、いくつかの計算を行う必要があります。