Wie zeichne ich 2 Rechtecke auf dem Bild in C # und markiere die Kreuzung?

Ich erstelle eine Winforms-Anwendung und muss in der Lage sein, ein Bild zu laden und dem Bild zwei sich schneidende Rechtecke hinzuzufügen. Ich möchte dann nur die Schnittmenge zwischen den beiden hervorheben. Gibt es Bibliotheken, die mir dabei helfen können?

Sind Sie verpflichtet, Winforms zu verwenden?

Antworten (2)

Dazu benötigen Sie keine Bibliothek eines Drittanbieters. Einige eingebaute Bibliotheken tun dies gut.

Verfahren:

  1. Zeichnen Sie jedes Rechteck über das vorhandene Bild
  2. Finden Sie den Schnittpunkt der beiden Rechtecke
  3. Zeichnen Sie ein drittes Rechteck (vielleicht mit einer Alpha-Mischung gefüllt)

Zeichnen Sie ein Rechteck:

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

Schnittpunkt zweier Rechtecke ermitteln:

... verwenden Sie die Methode Rectangle.Intersect aus System.Drawing ...

Gibt eine dritte Rectangle-Struktur zurück, die die Schnittmenge von zwei anderen Rectangle-Strukturen darstellt. Wenn es keinen Schnittpunkt gibt, wird ein leeres Rectangle zurückgegeben.

Zeichnen Sie ein Rechteck mit Transparenz / Alpha:

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);
    }
}

Referenzen:
https://stackoverflow.com/a/5942223/2869344
https://stackoverflow.com/a/21630086/2869344
https://stackoverflow.com/a/7580217/2869344

Sie können die LEADTOOLS Imaging Pro SDK-Technologie in Ihrer Anwendung verwenden. https://www.leadtools.com/sdk/products/imaging-pro

Sie können die LeadRect-Struktur verwenden, um zu sehen, ob sich zwei Rechtecke schneiden oder nicht. Entweder mit den Methoden Intersect oder IntersectsWith. Der folgende Code fügt einem geladenen Bild zwei Rechtecke als Anmerkungen hinzu, findet den Schnittpunktbereich und fügt dann eine dritte Rechteckanmerkung hinzu, die die Schnittmenge hervorhebt.

// 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);
}

Hier ist ein Screenshot des erwarteten Ergebnisses:Geben Sie hier die Bildbeschreibung ein