C#プログラミングの習作として作成したResWriterでは、bitmap、icon、jpeg等その他イメージをImageクラスで簡単に読み取れるので十把一絡げで"Image"にまとめてしまいましたが、ResourceWrite、ResXResourceWriterrクラスで保存すると皆bitmapになってしまいます。これはやはり習作の(ResGeneを転用した)ResReaderで見ると明らか(注)です。
//Imageリソースの書き込み(現行コード)
Image img = Image.FromFile(item.SubItems[2].Text); //ListViewのファイル名でImage Class objectを作る
res_writer.AddResource(item.SubItems[0].Text, img); //ResourceWriterでリソースを追加(*.resourcesファイル)
resx_writer.AddResource(item.SubItems[0].Text, img); //ResourceWriterでリソースを追加(*.resxファイル)
注:最初のicoCSはiconファイルで、次のimgCatはjpegファイルです。これはWindowsの内部処理では画像データの規定値をビットマップにして扱っている為なんじゃなかろうかと推定しています。
これではあんまり雑なので(おそらくはGDI+をベースにしていると思う)Imageクラスに何かデータ形式にかかわる内部情報を持っているのではないか?、と考え調べてみました。その結果、画像データ形式はImageFormatクラス(値の例:ImageFormat.Bmp、ImageFormat.Icon等)があり、識別できること、およびリソース書き込みの際に AddResource メソッドにオーバーロードがあり、↑のコードのように直接Imageオブジェクトを書き込む他に、(データの)ストリームで書き込むことができることがわかりました。それを使えば↓のようにオリジナルのデータでリソースを書き込めます。
MemoryStream imgStream = new MemoryStream(); //Image streamの作成
Image img = new Image(img_filename); //ファイル名(img_filename)からImageオブジェクトを生成
img.Save(imgStream, ImageFormat.(value)); //value形式でImageオブジェクトをメモリーに書き込む
ResourceWriterオブジェクト.AddResource(データ名, imgStream);
因みに前に作った(猫の画像の)jpegデータを書き込んだリソースファイルがあったので読み込むと、
↑のように「PinnedBUfferMemoryStream」という表記になりました。
ResWriter、ResReader共にイメージリソースの区分を細分化してストリームで書き込むか検討します。(注)
注:ストリーム(queを使ったデータ処理)を使う場合、(当たり前ですが)使っている間はImageオブジェクトをdisposeできません。従って事故的に止まるような例外処理対応(try-catch-finallyまたはusing())を必ずやれ、というお達しです。
ps. ところで余談ですが、Microsoft Learningの中に「埋め込みリソースは*.recourcesファイル」を前提とする記述がありましたので、前回の私の考え「(*.resources-*.resxも埋め込めますが、テキストファイルを埋め込むよりはバイナリーの方がサイズが小さいので実質的に*.resources一本やりでよいのでは?)」でよかったようです。
ps of ps. しかし、大分はまってしまい、BCC(ECC)SkeltonそっちのけでMSCompAssをいじってます。本当にC++のWin32 APIプログラムを書けなくなっちゃうのではないかと心配です。(newしっぱなしで、delete忘れそう。)

