Example #1
0
        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());
        }
Example #2
0
 private static ISlicer GetSlicer(SliceSettings settings)
 {
     return(settings.IsTrueSlice ? (ISlicer) new TrueSlicer() : new SlicerBySliceCount());
 }