在進行影像處理工作時, 經常需要批次處理,
處理的對象可能是某個目錄夾下的一序列影像 {0.bmp, 1.bmp, 2.bmp,….},
可以存放在一個List<string>的容器內, 紀錄該目錄夾特定附檔名的檔案名稱
1: public static List<string> searchFileNames(string sDirPath, string fileExtension)
2: {
3: List<string> list = new List<string>();
4: if (!Directory.Exists(sDirPath)) return null;
5: foreach (string filePath in System.IO.Directory.GetFiles(sDirPath, fileExtension))
6: {
7: list.Add(System.IO.Path.GetFileName(filePath));
8: }
9: return list;
10: }
"True love never goes smooth", 搜尋出來結果有點失望
一種做法是將位數補足2位數,但我不想這麼做…因為遲早會遇到
利用檔案名稱(不含副檔名)進行排序, 可以達到令人滿意的檔案名稱排序
1: if (BrowserTBx.Text.Length > 0)
2: {
3: _lastDir = BrowserTBx.Text;
4: _extensions = extensionTBx.Text;
5: List<string> list = FileTool.searchFileNames(_lastDir, _extensions);
6: filesLB.Items.Clear();
7: if(checkBox1.Checked)
8: try
9: {
10: list.Sort(delegate(string x, string y)
11: {
12: int x1 = Convert.ToInt16(Path.GetFileNameWithoutExtension(x));
13: int y1 = Convert.ToInt16(Path.GetFileNameWithoutExtension(y));
14: return x1.CompareTo(y1);
15: });
16: }
17: catch (Exception exception) { MessageBox.Show(exception.Message); }
18: if (list.Count > 0)
19: {
20: foreach (string item in list)
21: {
22: filesLB.Items.Add(item);
23: }
24: }
25: }
當使用者點選某個檔案名稱時, 希望可以自動載入圖片
1: private void LoadImage()
2: {
3: string filePath = _lastDir +"\\" + filesLB.Text;
4: try
5: {
6: if (extensionTBx.Text == "*.jpg" |
7: extensionTBx.Text == "*.bmp" |
8: extensionTBx.Text == "*.png" |
9: extensionTBx.Text == "*.tif")
10: imageBox1.Load( filePath );
11: }
12: catch
13: {
14: }
15: }
=======================================================================
(1)第一種狀況是檔名即編號+.bmp
上面比較函式採用匿名函式, 也可以自訂義類別如CompareByNum
1: public class CompareByNum : IComparer<string>
2: {
3: public int Compare(string x, string y) // implement IComparer interface
4: {
5: int x1 = Convert.ToInt16(Path.GetFileNameWithoutExtension(x));
6: int y1 = Convert.ToInt16(Path.GetFileNameWithoutExtension(y));
7: return x1.CompareTo(y1);
8: }
9: }
(2) 第二種狀況是 編號_X座標_Y座標.bmp
自訂義類別如CompareByNumUnderline
1: public class CompareByNumUnderline : IComparer<string>2: {
3: public int Compare(string x, string y) // implement IComparer interface4: {
5: string[] x_split = x.Split('_');6: string[] y_split = y.Split('_');7:
8: int x1 = Convert.ToInt16(x_split[0]);9: int y1 = Convert.ToInt16(y_split[0]);10: return x1.CompareTo(y1);11: }
12: }
如果是預設排序則是長得像這樣
(3) 第三種狀況是 列數_行數.bmp
1: public class CompareByRowColUnderline : IComparer<string>2: {
3: public int Compare(string x, string y) // implement IComparer interface4: {
5: string[] x_split = Path.GetFileNameWithoutExtension(x).Split('_');6: string[] y_split = Path.GetFileNameWithoutExtension(y).Split('_');7: int stride = 12;8: int row1 = Convert.ToInt16(x_split[0]);9: int row2 = Convert.ToInt16(y_split[0]);10: int col1 = Convert.ToInt16(x_split[1]);11: int col2 = Convert.ToInt16(y_split[1]);12: int ind1 = row1 * stride + col1;13: int ind2 = row2 * stride + col2;14: return ind1.CompareTo(ind2);15: }
16: }
================================================================
呼叫方式
1: private void SearchSubroutine()2: {
3: if (BrowserTBx.Text.Length > 0)4: {
5: _lastDir = BrowserTBx.Text;
6: _extensions = extensionTBx.Text;
7: List<string> list = FileTool.searchFileNames(_lastDir, _extensions);8: filesLB.Items.Clear();
9:
10: try11: {
12: switch (comboBox1.SelectedIndex)13: {
14: case 0:15: break;16: case 1:17: list.Sort(new CompareByNum());18: break;19: case 2:20: list.Sort(new CompareByNumUnderline());21: break;22: case 3:23: list.Sort(new CompareByRowColUnderline());24: break;25: }
26: }
27: catch (Exception exception) { MessageBox.Show(exception.Message); }28: if (list.Count > 0)29: {
30: foreach (string item in list)31: {
32: filesLB.Items.Add(item);
33: }
34: }
35: }
36: }
參考資料
全站熱搜