Я создаю приложение winforms, и мне нужно иметь возможность загрузить изображение и добавить к изображению 2 пересекающихся прямоугольника. Затем я хочу выделить только пересечение между ними. Существуют ли какие-либо библиотеки, которые могут помочь мне в этом?
Для этого вам не нужна сторонняя библиотека. Некоторые встроенные библиотеки прекрасно с этим справляются.
Процесс:
Нарисуйте прямоугольник:
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);
}
jmizv