秋休みも終わりです。
第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";
= gcnew MemoryStream(File::ReadAllBytes
(filename));
Bitmap^ bmp = gcnew Bitmap(ms);
/****加工処理****/
bmp->Save(filename, Imaging::ImageFormat::Jpeg);
delete(bmp);
ms->Close();
//------------正解プログラム----------
MemoryStream
を作成して、メモリ空間にファイルのコピーを作成してます。
ReadAllBytes
はファイルを開いてすぐ閉じるので、ファイルにロックはかかりません。
まぁ当然、ロックがかからないということは、
いつの間にか別プロセスがファイルを書き換えてたのに上書きしちゃったとか
そんな可能性もあるわけですけどね
ただし。上記プログラムでは、
JPEGの品質は最低で保存されてしまいます。
品質指定の方法についてはコチラ→JPEGの品質