秋休みも終わりです。


第11回投稿は

画像をメモリにコピーして開く方法。


先日、画像を開いて、加工して、上書き保存しようとしたところ

【GDI+ で汎用エラーが発生しました。】

とか言われて

「別名保存」はできるのに「上書き保存」はできなかったんです。;


//----------間違いプログラム---------

String^ filename = "C:\\xxxx.JPG";
Bitmap^ bmp = gcnew Bitmap(filename);

/****加工処理****/

bmp->Save (filename, Imaging::ImageFormat::Jpeg);

delete(bmp);

//----------間違いプログラム---------


で、FileStreamでファイルを開いて

FileStreamからBitmapを作成するとか

やってみたわけですが

それだとFileStreamを閉じたのにSaveでファイルアクセスしちゃうので

やっぱりエラー。


FileStreamとか、Bitmap(String^)とか使っちゃうと

ファイルにロックがかかるんですよね。


で、ロックをかけずに開く方法、見付けました。


//------------正解プログラム----------

String^ filename = "C:\\xxxx.JPG";

MemoryStream^ ms

= gcnew MemoryStream(File::ReadAllBytes (filename));
Bitmap^ bmp = gcnew Bitmap(ms);
/****加工処理****/

bmp->Save(filename, Imaging::ImageFormat::Jpeg);
delete(bmp);
ms->Close();

//------------正解プログラム----------


MemoryStream を作成して、メモリ空間にファイルのコピーを作成してます。
ReadAllBytes はファイルを開いてすぐ閉じるので、ファイルにロックはかかりません。v


まぁ当然、ロックがかからないということは、

いつの間にか別プロセスがファイルを書き換えてたのに上書きしちゃったとか

そんな可能性もあるわけですけどね(-▽-)



ただし。上記プログラムでは、

JPEGの品質は最低で保存されてしまいます。

品質指定の方法についてはコチラ→JPEGの品質