C#でBitmapのパレットを更新する

画像をいじる時に使うSystem.Drawing.Bitmapクラス。

PixelFormatをFormat1bppIndexedとかFormat8bppIndexedとかにするとピクセルデータの他にカラーテーブルを持つ。

カラーテーブルはPaletteプロパティ。

このようにカラーテーブルを持つフォーマットの場合、色はPaletteプロパティの値を変えるのだが、以下のようなコードではうまくセットされない。

ダメな例


  var bitmap = new System.Drawing.Bitmap(8, 8, System.Drawing.Imaging.PixelFormat.Format1bppIndexed);
  bitmap.Palette.Entries[0] = System.Drawing.Color.FromArgb(255, 255, 0, 0);
  bitmap.Palette.Entries[1] = System.Drawing.Color.FromArgb(255, 255, 255, 255);

 

 

どうやら、Paletteプロパティは、カラーテーブルの参照を返すのではなくクローンが帰ってくるらしい。

なので、カラーテーブルを取得して値を変えた後、Paletteプロパティへセットし直さなければならない。

(ちなみにColorPaletteクラスはコンストラクタが無いのでPaletteプロパティから取るしかない

 

 

 

 

 

正しい例

  var bitmap = new System.Drawing.Bitmap(8, 8, System.Drawing.Imaging.PixelFormat.Format1bppIndexed);
    var palette = bitmap.Palette;
    palette.Entries[0] = System.Drawing.Color.FromArgb(255, 255, 0, 0);
    palette.Entries[1] = System.Drawing.Color.FromArgb(255, 255, 255, 255);
    bitmap.Palette = palette;