Как нарисовать 2 прямоугольника на изображении в С# и выделить пересечение?

Я создаю приложение winforms, и мне нужно иметь возможность загрузить изображение и добавить к изображению 2 пересекающихся прямоугольника. Затем я хочу выделить только пересечение между ними. Существуют ли какие-либо библиотеки, которые могут помочь мне в этом?

Вы обязаны использовать Winforms?

Ответы (2)

Для этого вам не нужна сторонняя библиотека. Некоторые встроенные библиотеки прекрасно с этим справляются.

Процесс:

  1. Нарисуйте каждый прямоугольник поверх существующего изображения.
  2. Найдите пересечение двух прямоугольников
  3. Нарисуйте третий прямоугольник (возможно, заполненный альфа-смешением)

Нарисуйте прямоугольник:

        Rectangle ee = new Rectangle(10, 10, 30, 30);           
        using (Pen pen = new Pen(Color.Red, 2)) {
            e.Graphics.DrawRectangle(pen, ee);
        }

Найдите пересечение двух прямоугольников:

... используйте метод Rectangle.Intersect из System.Drawing...

Возвращает третью структуру Rectangle, представляющую пересечение двух других структур Rectangle. Если пересечения нет, возвращается пустой прямоугольник.

Нарисуйте прямоугольник с прозрачностью/альфа:

var alpha = 128; // this is your transparency between 0-255
using (Graphics g = Graphics.FromImage(pb.Image))
{
    using(Brush brush = new SolidBrush(Color.FromArgb(alpha, red, green, blue)))
    {
        g.FillRectangle(brush , x, y, width, height);
    }
}

Ссылки:
https://stackoverflow.com/a/5942223/2869344
https://stackoverflow.com/a/21630086/2869344
https://stackoverflow.com/a/7580217/2869344

Вы можете использовать технологию LEADTOOLS Imaging Pro SDK в своем приложении. https://www.leadtools.com/sdk/products/imaging-pro

Вы можете использовать структуру LeadRect, чтобы увидеть, пересекаются ли два прямоугольника или нет. Либо с помощью методов Intersect, либо IntersectsWith. Приведенный ниже код добавляет два прямоугольника в качестве аннотаций к загруженному изображению, находит область пересечения, а затем добавляет аннотацию третьего прямоугольника, выделяющую пересечение.

// Load the image
using (RasterCodecs _codecs = new RasterCodecs())
using (RasterImage _image = _codecs.Load(@"FILE PATH TO SOURCE IMAGE"))
{
    // Create the annotation container to store the annotation objects
    AnnContainer _container = new AnnContainer();
    _container.Mapper.MapResolutions(_image.XResolution, _image.YResolution, _image.XResolution, _image.YResolution);
    _container.Size = _container.Mapper.SizeToContainerCoordinates(_image.ImageSize.ToLeadSizeD());

    // Annotation unit is 1/720 of an inch
    double inch = 720.0;

    // Add 1st rectangle as annotation
    AnnRectangleObject _1stAnnRect = new AnnRectangleObject();
    _1stAnnRect.Rect = new LeadRectD(1 * inch, 2 * inch, 1 * inch, 3 * inch);
    _1stAnnRect.Stroke = AnnStroke.Create(AnnSolidColorBrush.Create("Green"), LeadLengthD.Create(1));
    _container.Children.Add(_1stAnnRect);

    // Add 2nd rectangle as annotation
    AnnRectangleObject _2ndAnnRect = new AnnRectangleObject();
    _2ndAnnRect.Rect = new LeadRectD(1 * inch, 2 * inch, 3 * inch, 2 * inch);
    _2ndAnnRect.Stroke = AnnStroke.Create(AnnSolidColorBrush.Create("Red"), LeadLengthD.Create(1));
    _container.Children.Add(_2ndAnnRect);

    // Get the intersecting rectangle
    LeadRectD _intersectingRect = LeadRectD.IntersectRects(_1stAnnRect.Rect, _2ndAnnRect.Rect);

    // Add intersecting rectangle as annotation to the container
    AnnRectangleObject _intersectingAnnRect = new AnnRectangleObject();
    _intersectingAnnRect.Rect = _intersectingRect;
    _intersectingAnnRect.Stroke = AnnStroke.Create(AnnSolidColorBrush.Create("Blue"), LeadLengthD.Create(1));
    _intersectingAnnRect.Fill = AnnSolidColorBrush.Create("Yellow");
    _container.Children.Add(_intersectingAnnRect);

    // Optional, burn annotations to image
    AnnWinFormsRenderingEngine _renderingEngine = new AnnWinFormsRenderingEngine();
    using (var burnedImage = _renderingEngine.RenderOnImage(_container, _image))
        _codecs.Save(burnedImage, @"C:\Temp\test.jpg", RasterImageFormat.Jpeg, 0);
}

Вот скриншот ожидаемого результата:введите описание изображения здесь