Ejemplo n.º 1
0
        public List <ImageStat> RemoveSimilar(ImageStatGroup imageStatGroup, double similarityThreshold)
        {
            Messaging.Talk($"Performing similarity scores on {imageStatGroup.Name} matrix...");

            // var threshold = similarityThreshold*0.01d;

            // grab comparable images

            var comparableImages = new ConcurrentDictionary <int, ComparableImage>();

            foreach (var imageStat in imageStatGroup.ImageStats)
            {
                var bm = _imageService.GetThumb(imageStat.ImagePath, 100, 100);
                comparableImages.TryAdd(imageStat.Id, new ComparableImage(bm));
            }

            Parallel.ForEach(imageStatGroup.ImageStats, imageStatLeft =>
            {
                foreach (var imageStatRight in imageStatGroup.ImageStats)
                {
                    if (imageStatLeft.Id == imageStatRight.Id)
                    {
                        continue;
                    }

                    //Messaging.Talk($"Performing similarity scores on set matrix on {Path.GetFileName(imageStatLeft.ImagePath)}");
                    var source      = comparableImages[imageStatLeft.Id];
                    var destination = comparableImages[imageStatRight.Id];
                    var similarity  = source.CalculateSimilarity(destination);

                    if (similarity >= imageStatLeft.Similarity)
                    {
                        imageStatLeft.Similarity = similarity;
                    }
                }
            });


            // remove not similar
            imageStatGroup.ImageStats = imageStatGroup.ImageStats.Where(i => i.Similarity >= similarityThreshold).ToList();

            Messaging.Talk($"Finished performing similarity scores on {imageStatGroup.Name} matrix...");

            return(imageStatGroup.ImageStats.ToList());
        }
        public void RenderGrid(DataGridView view, ImageStatGroup statGroup, FormOptions options,
                               MainFormController mainFormController)
        {
            // mark identical
            Messaging.Talk($"Looking for binary identical files...");

            view.SuspendLayout();

            if (options.ExtraSetAnalysis)
            {
                statGroup.ImageStats = _imageStatService.RemoveSimilar(statGroup, (double)options.SimilarityThreshold);
            }

            // add columns
            var requiredColumnsTotal = CalculateRequiredColumns(view);

            AddColumns(view, requiredColumnsTotal);

            //add rows
            var requiredRowsTotal = CalculateRequiredRows(requiredColumnsTotal, statGroup.ImageStats.Count);

            AddRows(view, requiredRowsTotal);

            // remove invalid
            RemoveStatsWithNoFile(statGroup.ImageStats, mainFormController);

            // prepare dataset
            var ordered = statGroup.ImageStats.OrderByDescending(i => i.Length).ToList();

            statGroup.ImageStats = ordered;


            // the current stat result
            var currentResultIndex = 0;

            // render grid iterating throught the rows
            foreach (DataGridViewRow row in view.Rows)
            {
                foreach (DataGridViewColumn column in view.Columns)
                {
                    var cell = row.Cells[column.Index] as DataGridViewImageCell;
                    cell.Value = null;

                    try
                    {
                        // only render while we are processing images
                        if (currentResultIndex <= statGroup.ImageStats.Count - 1)
                        {
                            var stat = statGroup.ImageStats[currentResultIndex];

                            cell.Value = _imageService.GetThumb(stat.ImagePath, _configService.ThumbMaxHeight);

                            if (stat.IsDuplicate == 1)
                            {
                                SetDuplicateDisplay(cell);
                            }
                            else
                            {
                                SetNotDuplicateDisplay(cell);
                            }

                            cell.Tag         = stat;
                            cell.Description = stat.ImagePath;

                            if (currentResultIndex == statGroup.ImageStats.Count - 1)
                            {
                                view.ClearSelection();
                                cell.Selected = true;
                            }
                        }
                    }
                    finally
                    {
                        cell.DataGridView.InvalidateCell(cell);
                        currentResultIndex += 1;
                        view.ResumeLayout();
                    }
                }
            }

            //GC.Collect();
            //GC.WaitForPendingFinalizers();
            //GC.Collect();

            view.Invalidate();
        }
 public void RenderGrid(DataGridView imagesGridView, ImageStatGroup selected, FormOptions getFormOptions, MainFormController controller)
 {
     _dataGridViewService.RenderGrid(imagesGridView, selected, getFormOptions, controller);
 }