C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 埋め込まれたリソースを読み出してファイルに書く


(過去ログ 21 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■8903 / inTopicNo.1)  埋め込まれたリソースを読み出してファイルに書く
  
□投稿者/ asuka (28回)-(2007/10/12(Fri) 20:08:01)

分類:[C#] 

お世話になっております。

test.icoファイルをリソースで保持し、プロパティを『埋め込まれたリソース』にしております。

これを読み出してファイルに書くことで、正規のファイルを作成したいのですが、

自分のやり方では間違っているようです。




// 現在のコードを実行しているアセンブリを取得
System.Reflection.Assembly asm =
System.Reflection.Assembly.GetExecutingAssembly();

// ビットマップとして読込み
Bitmap bmp = new Bitmap(asm.GetManifestResourceStream("ProjectTest.test.ico"));

// ファイルに書く
System.IO.StreamWriter sW =
new System.IO.StreamWriter(new System.IO.FileStream"C:\\iconB1.ico", System.IO.FileMode.CreateNew));
sW.Write(bmp);
sW.Close();



ファイルは作成されるのですが、テキストで『System.Drawing』と1行書かれているだけでした。

一応本当にファイルが埋め込まれているのか、以下のソースでデバッグしてみました。

// デバッグ:埋め込まれたリソース列挙
System.Reflection.Assembly asm =
System.Reflection.Assembly.GetExecutingAssembly();
//Assembyl asm = System.Reflection.Assembly.GetCallingAssembly();
//Assembly asm = GetType().Assembly;

string[] resNames = asm.GetManifestResourceNames();
StringBuilder sb = new StringBuilder(resNames.GetUpperBound(0));
foreach (string resName in resNames)
{
sb.AppendFormat("{0}\r\n", resName);
}
MessageBox.Show(sb.ToString());



結果、System.Reflection.Assembly.GetExecutingAssembly();で取得したものが、

メッセージボックスに表示され、test.icoは存在しておりましたので、

書出しの部分がまずいのかと思っております。



ピクチャーボックスですと、ピクチャーボックスに表示出来るもの、

たとえば、jpgにしろ、gifにしろicoにしろ、BITMAPオブジェクトで取得して表示出来たのですが、

ファイルの書出しは出来ないようでした。

ファイルの書出しを成功させるにはどのように処理すればよいのか、教えて頂ければ幸いです。



引用返信 編集キー/
■8904 / inTopicNo.2)  Re[1]: 埋め込まれたリソースを読み出してファイルに書く
□投稿者/ なちゃ (68回)-(2007/10/12(Fri) 20:13:18)
Bitmapつくる必要なんてないのでは?
ストリームから読み出しつつそのまま書き込めばいいでしょう。
引用返信 編集キー/
■8905 / inTopicNo.3)  Re[1]: 埋め込まれたリソースを読み出してファイルに書く
□投稿者/ IIJIMAS (42回)-(2007/10/12(Fri) 20:15:48)
No8903 (asuka さん) に返信
> ピクチャーボックスですと、ピクチャーボックスに表示出来るもの、
>
> たとえば、jpgにしろ、gifにしろicoにしろ、BITMAPオブジェクトで取得して表示出来たのですが、
>
> ファイルの書出しは出来ないようでした。

Bitmapの保存は
Image.Save メソッド (String, ImageFormat)
http://msdn2.microsoft.com/ja-jp/library/9t4syfhh(VS.80).aspx
をご使用ください。

StreamWriterはテキストファイルを作成するときに使います。
引用返信 編集キー/
■8912 / inTopicNo.4)  Re[2]: 埋め込まれたリソースを読み出してファイルに書く
□投稿者/ asuka (29回)-(2007/10/13(Sat) 14:00:49)
レスありがとうございます。

結果から申し上げますと成功致しました。

一応成功したソース(2パターン)を記載しておきます。(何方かにお役になれば)



// ■考察2 - 成功
System.Reflection.Assembly asm =
System.Reflection.Assembly.GetExecutingAssembly();

System.IO.Stream s =
asm.GetManifestResourceStream("Test.image.iconB1.ico");

FileStream writer = new FileStream(m_strPathInstallDir + "image\\iconB1.ico", FileMode.Create, FileAccess.Write );

int nbyte;
while ((nbyte = s.ReadByte()) != -1)
{
writer.WriteByte((byte)nbyte);
}
writer.Close();
s.Close();



// ■考察3
// リソースからストリーム作成
System.Reflection.Assembly asm =
System.Reflection.Assembly.GetExecutingAssembly();
Stream sIcon = asm.GetManifestResourceStream("TestP.image.iconB1.ico");

// ファイル作成
BinaryReader read = new BinaryReader(sIcon);
FileStream fs =
new FileStream(m_strPathInstallDir + "image\\iconB1.ico", FileMode.Create);
BinaryWriter write = new BinaryWriter(fs);

// ストリームから読出してファイルに書込み
byte[] bt = new byte[sIcon.Length];
sIcon.Read(bt, 0, bt.Length);
write.Write(bt);

// クローズ
sIcon.Close();
read.Close();
write.Close();
fs.Close();



とりあえずバイナリファイルなので、■考察3で実装することにしました。

速度を計ってはいませんが、1バイトづつ読書きするよりかは早いかと・・・




予断ですが、

■考察1
System.Reflection.Assembly asm =
System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream s =
asm.GetManifestResourceStream("TestP.image.iconB1.ico");

Bitmap bmp =
new Bitmap(asm.GetManifestResourceStream("TestP.image.iconB1.ico"));

bmp.Save(m_strPathInstallDir + "image\\iconB1.ico", System.Drawing.Imaging.ImageFormat.Icon);



というのも作ってみまして、実行したところ、アイコンファイルが出来るのですが、

アイコンファイルはディレクトリの一覧で目で見たときに、既にそのアイコンが表示されるはずですが、何故かシステムの不明なアイコンが表示されていました。

クリックしてビューアで見てみますと、意図したアイコンが表示されるのですが、

中身は元のバイナリと違っておりました。

■考察1だと何が悪いのか分からないのですが、お分かりでしたら教えて頂けると幸いです。

解決済み
引用返信 編集キー/
■8916 / inTopicNo.5)  Re[3]: 埋め込まれたリソースを読み出してファイルに書く
□投稿者/ IIJIMAS (43回)-(2007/10/13(Sat) 15:47:34)
No8912 (asuka さん) に返信
> というのも作ってみまして、実行したところ、アイコンファイルが出来るのですが、
>
> アイコンファイルはディレクトリの一覧で目で見たときに、既にそのアイコンが表示されるはずですが、何故かシステムの不明なアイコンが表示されていました。
>
> クリックしてビューアで見てみますと、意図したアイコンが表示されるのですが、
>
> 中身は元のバイナリと違っておりました。
>
> ■考察1だと何が悪いのか分からないのですが、お分かりでしたら教えて頂けると幸いです。

ごめんなさい、image.Saveはicoファイルで保存できない問題があるんでした…orz
(icoじゃないですが昔ハマったことありました…orz、なおってなかったのね。。。)
出力されたファイルはたぶんpng形式になっています。(バイナリの最初がPNGになってませんか。)

DOBONさんのサイト
画像フォーマットを指定して保存する
http://dobon.net/vb/dotnet/graphics/saveimage.html
の記述をご確認ください。
解決済み
引用返信 編集キー/
■8919 / inTopicNo.6)  Re[4]: 埋め込まれたリソースを読み出してファイルに書く
□投稿者/ asuka (30回)-(2007/10/13(Sat) 16:26:21)
IIJIMASさん

おお、そうだったんですか☆

それならメンバにIconとか入れないで欲しいですよね。^^

まぁ、使わせて頂いていると思っているので、仕方ないかで僕の場合済むんですけど、

疑問点が晴れてすっきりしました。

ありがとうございます。
引用返信 編集キー/
■8920 / inTopicNo.7)  Re[5]: 埋め込まれたリソースを読み出してファイルに書く
□投稿者/ asuka (31回)-(2007/10/13(Sat) 16:27:07)
『解決』マークが消えてしまったので再送します。

すいません、、、

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -