-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDatasetHandler.cs
108 lines (90 loc) · 3.33 KB
/
DatasetHandler.cs
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
namespace DatasetCreationTool
{
public class InputFilesUpdatedArgs
{
public InputFilesUpdatedArgs(List<string> files) { Files = files; }
public List<string> Files { get; }
}
public class DatasetHandler
{
private Int32 imageIndex;
public Rectangle SelectedRegion = Rectangle.Empty;
public Image SelectedImage;
private string currentClass;
public string CurrentClass
{
get { return currentClass; }
set
{
currentClass = value;
if (!CroppedImagesPerClass.ContainsKey(currentClass))
CroppedImagesPerClass[currentClass] = 0;
}
}
public Dictionary<string, Int64> CroppedImagesPerClass;
public delegate void InputFilesUpdatedHandler(object sender, InputFilesUpdatedArgs e);
public delegate void SelectedImageChangedHandler(object sender, EventArgs e);
public event InputFilesUpdatedHandler InputFilesUpdated;
public event SelectedImageChangedHandler SelectedImageChanged;
public DatasetHandler()
{
CroppedImagesPerClass = new Dictionary<string, Int64>();
}
public Int32 ImageIndex
{
get { return imageIndex; }
set
{
if (value >= ImagesFiles.Count)
imageIndex = ImagesFiles.Count - 1;
else if (value < 0)
imageIndex = 0;
else
imageIndex = value;
if (ImagesFiles.Any())
{
var oldImage = SelectedImage;
SelectedRegion = Rectangle.Empty;
SelectedImage = Image.FromFile(ImagesFiles[imageIndex]);
oldImage?.Dispose();
SelectedImageChanged?.Invoke(this, EventArgs.Empty);
}
}
}
public List<string> ImagesFiles { get; private set; }
public bool OpenDirectory(string path)
{
if (!Directory.Exists(path))
return false;
ImagesFiles = Directory.EnumerateFiles(path, "*")
.Where(f => IsSupportedFormat(new FileInfo(f).Extension))
.ToList();
bool result = ImagesFiles.Any();
if (result)
ImageIndex = 0;
return result;
}
public static bool IsSupportedFormat(string extension)
{
return extension == ".jpg" ||
extension == ".bmp" ||
extension == ".png" ;
}
public string SaveSelectedPatch(string saveDir)
{
using var bmp = new Bitmap(SelectedRegion.Width, SelectedRegion.Height);
using (var graphics = Graphics.FromImage(bmp))
graphics.DrawImage(SelectedImage, new Rectangle(0, 0, bmp.Width, bmp.Height), SelectedRegion, GraphicsUnit.Pixel);
var path = Path.Combine(saveDir, $"{CurrentClass}_{CroppedImagesPerClass[CurrentClass]++}.jpg");
bmp.Save(path, ImageFormat.Jpeg);
return path;
}
}
}