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?
Dazu benötigen Sie keine Bibliothek eines Drittanbieters. Einige eingebaute Bibliotheken tun dies gut.
Verfahren:
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);
}
jmizv