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 例外等)でもアプリを継続させる.