diff --git a/TIASshot.Tests/IoUtilSaveImageTests.cs b/TIASshot.Tests/IoUtilSaveImageTests.cs
new file mode 100644
index 0000000..4103e30
--- /dev/null
+++ b/TIASshot.Tests/IoUtilSaveImageTests.cs
@@ -0,0 +1,68 @@
+using System;
+using System.IO;
+using NUnit.Framework;
+using OpenCvSharp;
+
+namespace TIASshot.Tests {
+ ///
+ /// IoUtil.SaveImage のテスト.
+ /// Cv2.ImWrite は保存失敗(存在しないフォルダ・ディスク満杯・権限等)で例外を出さず
+ /// false を返すだけであり,戻り値を検査しないと保存失敗が無通知で成功扱いになる.
+ /// SaveImage が失敗を false として正しく報告すること,および正常パスでは
+ /// true を返して実際にファイルが生成されること(従来挙動の特性化)を検証する.
+ ///
+ [TestFixture]
+ public class IoUtilSaveImageTests {
+
+ private string _tempFolder;
+
+ [SetUp]
+ public void SetUp() {
+ _tempFolder = Path.Combine(Path.GetTempPath(), "TIASshotTests_" + Guid.NewGuid().ToString("N"));
+ Directory.CreateDirectory(_tempFolder);
+ }
+
+ [TearDown]
+ public void TearDown() {
+ if (Directory.Exists(_tempFolder)) {
+ Directory.Delete(_tempFolder, recursive: true);
+ }
+ }
+
+ ///
+ /// 存在しないフォルダへの保存は false を返す(保存失敗が無通知で成功扱いにならない)
+ ///
+ [Test]
+ public void SaveImage_存在しないフォルダ_falseを返す() {
+ // Arrange
+ var path = Path.Combine(_tempFolder, "no_such_dir", "out.png");
+ using (var img = new Mat(4, 4, MatType.CV_8UC3, Scalar.All(128))) {
+
+ // Act
+ var result = IoUtil.SaveImage(path, img);
+
+ // Assert
+ Assert.IsFalse(result, "存在しないフォルダへの保存失敗が false で報告されること");
+ Assert.IsFalse(File.Exists(path), "ファイルが生成されていないこと");
+ }
+ }
+
+ ///
+ /// 正常なパスへの保存は true を返しファイルが生成される(従来挙動の特性化)
+ ///
+ [Test]
+ public void SaveImage_正常なパス_trueを返しファイルが生成される() {
+ // Arrange
+ var path = Path.Combine(_tempFolder, "out.png");
+ using (var img = new Mat(4, 4, MatType.CV_8UC3, Scalar.All(128))) {
+
+ // Act
+ var result = IoUtil.SaveImage(path, img);
+
+ // Assert
+ Assert.IsTrue(result, "正常な保存では true を返すこと");
+ Assert.IsTrue(File.Exists(path), "ファイルが生成されていること");
+ }
+ }
+ }
+}
diff --git a/TIASshot.Tests/TIASshot.Tests.csproj b/TIASshot.Tests/TIASshot.Tests.csproj
index e700351..4c8a255 100644
--- a/TIASshot.Tests/TIASshot.Tests.csproj
+++ b/TIASshot.Tests/TIASshot.Tests.csproj
@@ -61,6 +61,7 @@
+
diff --git a/TIASshot/Utils/IoUtil.cs b/TIASshot/Utils/IoUtil.cs
index 925d032..3bbd776 100644
--- a/TIASshot/Utils/IoUtil.cs
+++ b/TIASshot/Utils/IoUtil.cs
@@ -112,6 +112,21 @@
}
///
+ /// 画像をファイルに保存する.
+ /// Cv2.ImWrite は保存失敗(ディスク満杯・パス不正・権限等)で例外を出さず false を
+ /// 返すだけのため,戻り値を検査して失敗を Debug.WriteLine に記録し bool で返す.
+ /// 例外(拡張子不正等)は捕捉せず伝播する(従来挙動どおり).
+ ///
+ /// 保存先ファイルパス
+ /// 保存する画像
+ /// 保存に成功したら true
+ public static bool SaveImage(string path, Mat img) {
+ var ok = Cv2.ImWrite(path, img);
+ if (!ok) Debug.WriteLine($"画像の保存に失敗しました: {path}");
+ return ok;
+ }
+
+ ///
/// 設定値をCSVファイルに書き込む
///
///