ここんところC#付けの毎日です。

とそんな中、C#のコーディングで何気ない所で詰まってしまったので、メモしてみます。
やりたいことは、

画像ファイルをダイアログからか、ドラッグ&ドロップで読み込み、コントロール(今回はボタンですが)に表示。
保存ボタンで特定の固定のファイル名で保存する。

というこれだけのことです。で、こんな簡単な所で2点詰まった…。

  1. ImageクラスのFromFileメソッドを用いて画像を読み込むと、プログラム終了するまでファイルロックされたままになり、Image.Save時にファイルがロック(使用中)になり上書きできない。
  2. ImageクラスのFromStreamメソッドを用いて画像を読み込むと、ロックは解消されるが、Image.Save時に「GDI+ で一般的なエラーが発生しました」となり、保存できない。

1点目の解決方法は、以下のとおり。

ImageクラスのFromFileメソッドを用いて画像を読み込むと、プログラム終了するまでファイルロックされたままになる。
というのが有るそうで、早速FromFile から FromStreamで読み込むように変更。

PictureBox に画像を表示する
http://jeanne.wankuma.com/tips/image/picturebox.html

「プログラムが終了するまで、ファイルがロックされたままになります」
とあちこちのC#入門サイトに書いてありますが、私の開発環境ではIDEも終了するまでファイルがロックされているようでした。

それを裏付ける(?)記述が以下にありました。

[PRB] PictureBox Image プロパティにファイルを設定すると、イメージ ファイルがロックさる
http://support.microsoft.com/default.aspx?scid=kb;ja;311754

てなかんじで、ふむふむ、ロックされなくなったぞ。

よし、できた!

…と、安心したのもつかの間、今度は、Image.Saveとすると、2点目の問題発生。

GDI+ で一般的なエラーが発生しました」orz..

色々調べてみても、何が原因かわからず途方にくれていたら、やはり同じことで詰まってる人はいるということのようです。

以下の所で解決策が見つかりました。

ImageクラスのFileStreamで読み込んだ画像の保存
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15772&forum=7&6

FileStream fs;
fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
Bitmap bmp = (Bitmap)System.Drawing.Bitmap.FromStream(fs);
fs.Close();
pictureBox1.Image =new Bitmap(bmp);
:
pictureBox1.Image.Save(~);

こんな感じで解決でした。
ポイントは、FileStreamメソッドでBitmapとして読み込めばSave時もOKってことですかね。

あ、C#素人なんで、用語とか適当かも…。