2015年5月14日木曜日

「GDI+ で汎用エラーが発生しました。」回避方法 (C++/CLI)

以下のプログラムではエラーが発生します。

Bitmap^ b1 = gcnew Bitmap("C:\\tmp.png");
Bitmap^ b2 = gcnew Bitmap(b1->Width, b1->Height);
Graphics^ g = Graphics::FromImage(b2);
g->DrawImage(b1, 0, 0, b1->Width, b1->Height);
b2->Save("C:\\tmp.png", System::Drawing::Imaging::ImageFormat::Png);

原因は、同一ファイル名でセーブしようしましたが、b1 がファイルオープンのままになっているからです。

b1 を解放すればエラーは回避できます。

Bitmap^ b1 = gcnew Bitmap("C:\\tmp.png");
Bitmap^ b2 = gcnew Bitmap(b1->Width, b1->Height);
Graphics^ g = Graphics::FromImage(b2);
g->DrawImage(b1, 0, 0, b1->Width, b1->Height);
delete b1;
b2->Save("C:\\tmp.png", System::Drawing::Imaging::ImageFormat::Png);