Vectorに登録した「画像ファイルの色を置換したい」を改良する(1)の続きです。
複数のファイルをまとめて処理する
[複数のファイル]ボタンがクリックされたら複数のファイルを選択することができるダイアログを表示させます。複数のファイル(単数でももちろん可)が選択されたときに、それらのファイルに対して色置換の処理をおこなう処理を示します。
出力先フォルダは選択されたファイルがあるフォルダがあるフォルダ内に処理が開始された時刻を名前とするフォルダを作成して、それを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public partial class Form1 : Form { OpenFileDialog openFilesDialog = new OpenFileDialog(); private void buttonSelectFiles_Click(object sender, EventArgs e) { openFilesDialog.Filter = "Image Files png(*.png) bmp(*.bmp) gif(*.gif) jpg(*.jpg *.jepg) tiff(*.tiff *.tif)|*.png;*.bmp;*.gif;*.jpg;*.jepg;*.tiff;*.tif"; openFilesDialog.Multiselect = true; if (openFilesDialog.ShowDialog() == DialogResult.OK) { string outputFolderName = "Output-" + DateTime.Now.ToString("yyyy-MMdd-HHmmss"); string[] inputPaths = openFilesDialog.FileNames; FileInfo info = new FileInfo(inputPaths[0]); string saveFolderPath = Path.Combine(info.DirectoryName, outputFolderName); foreach (string inputPath in inputPaths) { FileInfo inputFileInfo = new FileInfo(inputPath); string outputPath = Path.Combine(saveFolderPath, inputFileInfo.Name); SaveReplaceBitmap(inputPath, outputPath); // 後述 } // 実際に使ってみると使いづらい。なので保存されたフォルダを自動で開くようにした。 System.Diagnostics.Process.Start(saveFolderPath); } } } |
色置換をするメソッドを示します。第一引数は処理の対象となるファイル、第二引数は保存するパスです。ファイルのなかには画像ファイルではないものもある可能性があるため、例外処理をしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public partial class Form1 : Form { void SaveReplaceBitmap(string inputPath, string outputPath) { try { Bitmap bitmap = new Bitmap(inputPath); Bitmap newBitmap = GetReplaceBitmap(bitmap); FileInfo outputPathInfo = new FileInfo(outputPath); if (!Directory.Exists(outputPathInfo.DirectoryName)) Directory.CreateDirectory(outputPathInfo.DirectoryName); FileInfo inputPathInfo = new FileInfo(inputPath); if (inputPathInfo.Extension.ToLower() == ".png") newBitmap.Save(outputPath, ImageFormat.Png); else if (inputPathInfo.Extension.ToLower() == ".bmp") newBitmap.Save(outputPath, ImageFormat.Bmp); else if (inputPathInfo.Extension.ToLower() == ".gif") newBitmap.Save(outputPath, ImageFormat.Gif); else if (inputPathInfo.Extension.ToLower() == ".jpg" || inputPathInfo.Extension.ToLower() == ".jepg") newBitmap.Save(outputPath, ImageFormat.Jpeg); else if (inputPathInfo.Extension.ToLower() == ".tiff" || inputPathInfo.Extension.ToLower() == ".tif") newBitmap.Save(outputPath, ImageFormat.Tiff); else newBitmap.Save(outputPath); bitmap.Dispose(); newBitmap.Dispose(); } catch { } } } |
指定されたフォルダ内のファイルをまとめて処理する
[フォルダ単位]ボタンがクリックされたらフォルダを選択するダイアログを表示させます。フォルダが選択されたときに、そのなかにあるファイル(サブフォルダ内のファイルも含む)に対して色置換の処理をおこなう処理を示します。
フォルダの場合はちょっと面倒です。そこで処理前のファイルのパスと処理後のファイルのパスを登録した辞書をつくります。
引数は処理の対象となるフォルダのパスと保存されるフォルダの名前(名前であってパスではない)です。処理の対象となるファイルのパスと処理後に保存するパスは途中までは同じなので文字列置換でいらない部分を削除して結合させています。
注意することとして親フォルダが存在するときは Directory.GetParent(selectedFolderPath).FullName;が返す文字列の最後に’\’はつかないけれど、そうでない場合は”C:\”のように後ろに’\’がついてしまうことです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public partial class Form1 : Form { // 第二引数のoutputFolderNameはパスではなくフォルダの名前 Dictionary<string, string> GetOutputFilePaths(string selectedFolderPath, string outputFolderName) { string parentPath = Directory.GetParent(selectedFolderPath).FullName; // 引数の親フォルダのパスに '\'を追加する if (parentPath.Last() != '\\') parentPath += "\\"; // 保存先は処理対象のファイルまたはフォルダがあるフォルダのなかに outputFolderNameの名前で作成 string saveFolderPath = Path.Combine(parentPath, outputFolderName); Dictionary<string, string> keyValues = new Dictionary<string, string>(); string[] inputFilePaths = Directory.GetFiles(selectedFolderPath, "*", SearchOption.AllDirectories); List<string> outputFilePaths = new List<string>(); foreach (String inputFilePath in inputFilePaths) { string path = inputFilePath.Replace(parentPath, ""); outputFilePaths.Add(Path.Combine(saveFolderPath, path)); keyValues.Add(inputFilePath, Path.Combine(saveFolderPath, path)); } return keyValues; } } |
FolderBrowserDialogを表示させて選択されたフォルダ内の画像ファイルに対する色置換をする処理の部分を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public partial class Form1 : Form { FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog(); private void buttonSelectFolder_Click(object sender, EventArgs e) { if (folderBrowserDialog.ShowDialog() == DialogResult.OK) { string selectedPath = folderBrowserDialog.SelectedPath; string outputFolderName = "Output-" + DateTime.Now.ToString("yyyy-MMdd-HHmmss"); DirectoryInfo info = new DirectoryInfo(selectedPath); string saveFolderPath = Path.Combine(info.Parent.FullName, outputFolderName); // saveFolderPath はおそらく存在しないのでなければ作る if (!Directory.Exists(saveFolderPath)) Directory.CreateDirectory(saveFolderPath); Dictionary<string, string> dic = GetOutputFilePaths(selectedPath, outputFolderName); foreach (var valuePair in dic) SaveReplaceBitmap(valuePair.Key, valuePair.Value); // 処理が終わったら保存先のフォルダを開く System.Diagnostics.Process.Start(saveFolderPath); } } } |
ドラッグアンドドロップ時の処理
ドラッグアンドドロップされた場合はチェックボックスの状態で処理をわけます。チェックされているときは上記の方法で、
複数のファイルとフォルダ内のファイルに対する処理をおこないます。チェックがされていない場合はメニューの[ファイルを開く]と同じ処理をおこないます。
ドラックされているときの処理を示します。
ここではドラッグされているものがファイルかフォルダのときとそうでないときのマウスカーソルの形状を変えます。
1 2 3 4 5 6 7 8 9 10 |
public partial class Form1 : Form { protected override void OnDragOver(DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.All; else e.Effect = DragDropEffects.None; } } |
ドロップされたらチェックボックスの状態となにがドロップされたのかを調べて適切な処理をおこないます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
public partial class Form1 : Form { protected override void OnDragDrop(DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); if (!checkBox1.Checked) { try { // メニューの[ファイルを開く]と同じ動作 Bitmap bitmap = new Bitmap(files[0]); Bitmap = new Bitmap(bitmap); bitmap.Dispose(); } catch { } } else { string outputFolderName = "Output-" + DateTime.Now.ToString("yyyy-MMdd-HHmmss"); foreach (string path in files) { // ドロップされたものがフォルダの場合 if (Directory.Exists(path)) { Dictionary<string, string> dic = GetOutputFilePaths(path, outputFolderName); foreach (var pair in dic) SaveReplaceBitmap(pair.Key, pair.Value); } // ドロップされたものがファイルの場合 if (File.Exists(path)) { FileInfo fi = new FileInfo(path); string outputPath = Path.Combine(fi.DirectoryName, outputFolderName, fi.Name); SaveReplaceBitmap(path, outputPath); } } } } } } |