.NET 4.x Вырезать в отдельный файл области красного цвета(изображение) - C#

Узнай цену своей работы

Формулировка задачи:

Есть изображение Из него требуется получить большие скопления красного цвета. Проше говоря находим скопление, выделяем его по краям вырезаем эту часть и сохраняем. Скопления могу быть на одном уровне по Y или по X.
Собственно вот функция вырезания и сохранения
        // Первым параметром передаём исходное изображение
        // Вторым и третим координаты верхнего левого угла вырезаемой части
        // Два последующих параметра ширина и высота вырезаемой части
        private void CutAndSave(Bitmap image, int x, int y, int width, int height)
        {
            Rectangle rect = new Rectangle(x, y, width, height);
 
            var ret = new Bitmap(rect.Width, rect.Height);
            using (var g = Graphics.FromImage(ret))
                g.DrawImage(image, 0, 0, rect, GraphicsUnit.Pixel);
 
            ret.Save("save.png");
        }
А вот как определить место нахождение этих областей ?

Решение задачи: «.NET 4.x Вырезать в отдельный файл области красного цвета(изображение)»

textual
Листинг программы
        const int max_padding = 32;
        public Bitmap ClearBitmap(Bitmap src)
        {
            var mask = SearchRegions(src);
 
            List<Rectangle> regions = new List<Rectangle>();
            Point topLeft = new Point(mask.Width, mask.Height), downRight = new Point(0, 0);
            int last_paddingY = 0;
 
            for (int y = 0; y < mask.Height; y++)
            {
                for (int x = 0; x < mask.Width; x++)
                {
                    if (mask.GetPixel(x, y).R == 255)
                    {
                        if (y - last_paddingY <= max_padding || topLeft.Y == mask.Height)
                        {
                            if (topLeft.Y == mask.Height) { topLeft.Y = y; }
                            if (topLeft.X > x) { topLeft.X = x; }
                            if (downRight.X < x) { downRight.X = x; }
 
                            last_paddingY = y;
                        }
                        else
                        {
                            downRight.Y = last_paddingY;
 
                            regions.Add(new Rectangle(topLeft.X, topLeft.Y, downRight.X - topLeft.X + 1, downRight.Y - topLeft.Y + 1));
 
                            topLeft = new Point(mask.Width, mask.Height);
                            downRight = new Point(0, 0);
                        }
                    }
                }
            }
 
            List<Bitmap> bitmaps = new List<Bitmap>();
            foreach (Rectangle region in regions)
                CutAndSave(src, region);
 
            return mask;
        }
        private void CutAndSave(Bitmap src, Rectangle rect)
        {
            DateTime a = DateTime.Now;
            src.Clone(rect, PixelFormat.Format32bppArgb).Save(a.Millisecond + ".jpg");
            Thread.Sleep(1);
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.667 из 5
Похожие ответы