2007年11月23日金曜日

Bitmap、ColorPalette

ごめんなさい、ColorPaletteのAccessViolationExceptionは別の原因でした。
Bitmapコンストラクタには

scan0パラメータで指定されたメモリブロックの割り当てと解放は呼び出し元が行いますが、関連するBitmapが解放されるまでメモリは解放されません。
とありますが、これを守っていませんでした。Bitmapコンストラクタが終了した時点でメモリブロックを解放していました。Bitmap.LockBits()をするのが正解なようです。

ColorPaletteクラスが変則的な理由を調べるためにGDI+について調べました。
GDI+はもともとnative(unmanaged)で実装されていてBitmapクラスなどはそのwrapperになっています。そしてColorPaletteはというと、単なる構造体であり対応するnativeクラスはありません。…だからと言って扱いづらいクラス設計をしていいわけではありませんがっ。

見た感じColorPaletteクラスは複数のBitmapクラスで共有してもよさそうです。というよりも対応するnativeクラスが存在しないため、Bitmap.Paletteに代入された時点で値だけがnativeクラス側にコピーされColorPaletteの共有状態にはならないようです。

0 件のコメント: