diff --git a/TIASshot/Cameras/CameraBase.cs b/TIASshot/Cameras/CameraBase.cs index 55b0474..a44c352 100644 --- a/TIASshot/Cameras/CameraBase.cs +++ b/TIASshot/Cameras/CameraBase.cs @@ -260,7 +260,7 @@ var filename = Config.GetString("File/RgbImage"); filename = filename.Replace("{NO}", $"{idx + 1:0000}"); - IoUtil.SaveImage(IoUtil.CombineSaveFilePath(_saveFolder, filename), img); + SaveImageOrThrow(IoUtil.CombineSaveFilePath(_saveFolder, filename), img); foreach (var channel in _colorCorrector.Channels) { // ConvertImage は src を in-place で CV_64FC3 に変換するため、 @@ -271,12 +271,27 @@ using (var converted = _colorCorrector.ConvertImage(imgClone, channel)) { filename = GetFilenameWithChannel("File/SrgbImage", channel); filename = filename.Replace("{NO}", $"{idx + 1:0000}"); - IoUtil.SaveImage(IoUtil.CombineSaveFilePath(_saveFolder, filename), converted); + SaveImageOrThrow(IoUtil.CombineSaveFilePath(_saveFolder, filename), converted); } } } /// + /// 撮影画像を保存し,失敗(IoUtil.SaveImage が false)なら IOException を投げる(SaveImages 専用). + /// Cv2.ImWrite は保存失敗(ディスク満杯・権限・同名フォルダ等)で例外を出さず false を返すだけのため, + /// 戻り値を無視すると保存できていない画像が「全ての画像保存完了」と表示される. + /// 例外にして SaveThread の catch → finally(DrainShots → NotifySaveFailed → RestoreShotButtons)の + /// 失敗経路に乗せ,ユーザーへ保存失敗を通知する. + /// + /// 保存先ファイルパス + /// 保存する画像 + private static void SaveImageOrThrow(string path, Mat img) { + if (!IoUtil.SaveImage(path, img)) { + throw new IOException($"ファイル({path})の書き込みに失敗しました."); + } + } + + /// /// 画像保存スレッド処理. /// バックグラウンドスレッドの未処理例外は .NET Framework 4.8 ではプロセスを即終了させるため, /// ここに例外境界を置き,保存失敗(ディスク満杯・パス不正・OpenCV 例外等)でもアプリを継続させる.