2008年5月22日木曜日

C# .NET Bitmap シリアライズ

プラグインベースのシステムを作っていて、
あるプラグインから別のプラグインにビットマップオブジェクトを渡す必要ができました。

GUIは基本的にC#で組んでいるのですが、システム全体がC言語も含むので、
プラグイン同士のデータの受け渡しは、(もちろんカプセル化して)メモリブロックを使っています。

メモリレイアウトを規約で決めて、お互いがレイアウトを知っているという前提で読み書きしているのですが、やっぱり、予想通り、.NETのオブジェクトをそのまま渡したいケースが出てきてしまったという訳で、

「C# .NET Bitmap シリアライズ」でググってみたところ、

おすぎ@にせものさんのブログに「XMLシリアライズ時にビットマップも含める」という記事があり、参考にさせてもらいます。

なんだか、スマートな感じにbyte配列に変換しています。
無論、逆変換もできるのでしょう♪

真似して以下のようにしてみました。
Load and Save objects to XML using serializationを参考にされたということです...時間と気力があれば見てみたいとおもいます(^_^;)


public Bitmap Picture{ get { return _picture; } set { _picture = value; } }
private Bitmap _picture;

public byte[] PictureByteArray {
get {
if (Picture != null) {
TypeConverter BitmapConverter =
TypeDescriptor.GetConverter(Picture.GetType());

return (byte[])BitmapConverter.ConvertTo(Picture, typeof(byte[]));
} else {
return null;
}
}
set {
if (value != null) {
Picture = new Bitmap(new MemoryStream(value));
} else {
Picture = null;
}
}
}