using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Media;
using OpenCvSharp;
namespace TIASshot {
/// <summary>
/// ファイル I/O(CSV 読み書き・保存フォルダ生成・撮影情報出力)とサウンド再生の
/// ユーティリティ.CameraBase から委譲される.状態を持たない.
/// </summary>
internal static class IoUtil {
/// <summary>
/// csvファイルからMatを読み込む
/// </summary>
/// <param name="csvFile"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static Mat LoadMatFromCsv(string csvFile) {
try {
var arr = new List<double[]>();
int cols = -1;
using (var reader = new StreamReader(csvFile)) {
while (!reader.EndOfStream) {
var line = reader.ReadLine();
var valStrs = line.Split(',');
if (cols == -1) cols = valStrs.Length;
else if (cols != valStrs.Length) throw new Exception("cols != valStrs.Length");
var vals = valStrs.Select(x => double.Parse(x)).ToArray();
arr.Add(vals);
}
}
var m = new Mat(arr.Count, cols, MatType.CV_64FC1);
for (var row = 0; row < arr.Count; row++) {
for (var col = 0; col < cols; col++) {
m.At<double>(row, col) = arr[row][col];
}
}
return m;
} catch (Exception) {
return null;
}
}
/// <summary>
/// Matをcsvファイルに保存
/// </summary>
/// <param name="csvFile"></param>
/// <param name="m"></param>
public static void SaveMatToCsv(string csvFile, Mat m) {
using (var writer = new StreamWriter(csvFile)) {
for (var row = 0; row < m.Rows; row++) {
var line = "";
for (var col = 0; col < m.Cols; col++) {
if (col > 0) line += ",";
line += $"{m.At<double>(row, col):0.0000000}";
}
writer.WriteLine(line);
}
}
}
/// <summary>
/// 保存フォルダを生成し,そのパスを返す
/// </summary>
/// <param name="note"></param>
/// <returns>生成した保存フォルダのパス</returns>
public static string CreateSaveFolder(string note) {
var dt = DateTime.Now;
var paths = new List<string>() {
Config.GetString("File/SaveFolder"),
dt.ToString("yyyy-MM-dd"),
dt.ToString("HH_mm_ss") + $"-{note}",
};
var saveFolder = Path.Combine(paths.ToArray());
Directory.CreateDirectory(saveFolder);
return saveFolder;
}
/// <summary>
/// 設定値をCSVファイルに書き込む
/// </summary>
/// <param name="sw"></param>
/// <param name="info"></param>
public static void WriteInfo(StreamWriter sw, Dictionary<string, string> info) {
sw.WriteLine($"撮影日時,{DateTime.Now:yyyy/MM/dd HH:mm:ss}"); // 撮影日時を追加
foreach (var kvp in info) {
sw.WriteLine($"{kvp.Key},{kvp.Value}");
}
}
/// <summary>
/// 効果音を再生する
/// </summary>
/// <param name="wavfile"></param>
public static void PlaySound(string wavfile) {
if (!File.Exists(wavfile)) {
Debug.WriteLine($"音声ファイルが見つかりません: {wavfile}");
return;
}
try {
using (var player = new SoundPlayer(wavfile)) {
player.Play();
}
} catch (Exception ex) {
Debug.WriteLine($"音声再生に失敗しました: {ex.Message}");
}
}
}
}