public static void Slice(SliceSettings settings, IProgress <double> progress) { var files = Directory.GetFiles(settings.InputDirectory) .Where(x => Extensions.Contains(Path.GetExtension(x))) .ToArray(); var maxFiles = files.Length; var tasks = new List <Task <int> >(); var l = new object(); var slicedFiles = 0; var slicer = GetSlicer(settings); var previousTask = Task <int> .Factory.StartNew(() => 1); foreach (var imagePath in files) { var currentTaskWaitingTask = previousTask; var task = Task <int> .Factory.StartNew(() => { var currentImagePath = imagePath; var image = new Bitmap(currentImagePath); var slices = slicer.GetSlices(settings, image); var resultImages = SliceImage(image, slices.ToArray()); image.Dispose(); currentTaskWaitingTask.Wait(); var i = currentTaskWaitingTask.Result; foreach (var resImage in resultImages) { var path = $"{settings.OutputDirectory}\\{i.ToString().PadLeft(settings.Pad, '0')}.png"; resImage.Save(path); i++; resImage.Dispose(); } lock (l) { slicedFiles++; progress.Report((double)slicedFiles / maxFiles); } return(i); }); previousTask = task; tasks.Add(task); } Task.WaitAll(tasks.ToArray()); }
private static ISlicer GetSlicer(SliceSettings settings) { return(settings.IsTrueSlice ? (ISlicer) new TrueSlicer() : new SlicerBySliceCount()); }