Gets a list of the location points.
public IList<LeadPoint> Points { get; }
The list of the location points.
Note that if Shape is set to ImageViewerRubberBandShape.FreeHand, then Points can have any number of points including 1. When Shape is any other value, the number of points is always two (the first and second point).
using Leadtools;
using Leadtools.Controls;
using Leadtools.Codecs;
using Leadtools.Drawing;
using Leadtools.ImageProcessing;
using Leadtools.ImageProcessing.Color;
public static bool AddRoundRect(GraphicsPath path, LeadRect bounds, int xRadius, int yRadius)
{
if (bounds.Width < 1 || bounds.Height < 1)
return false;
if (xRadius < 1 || yRadius < 1)
{
// Add a rectangle
path.AddRectangle(new Rectangle(bounds.X, bounds.Y, bounds.Width, bounds.Height));
return true;
}
int x = bounds.X;
int y = bounds.Y;
int width = bounds.Width;
int height = bounds.Height;
// adapt horizontal and vertical diameter if the rectangle is too little
int xDiameter = xRadius * 2;
int yDiameter = yRadius * 2;
if (width < (xDiameter))
xDiameter = width;
if (height < (yDiameter))
yDiameter = height;
xRadius = xDiameter / 2;
yRadius = yDiameter / 2;
int xw = x + width;
int yh = y + height;
int xwr = xw - xRadius;
int yhr = yh - yRadius;
int xr = x + xRadius;
int yr = y + yRadius;
int xwr2 = xw - xDiameter;
int yhr2 = yh - yDiameter;
path.StartFigure();
path.AddArc(x, y, xDiameter, yDiameter, 180, 90);
path.AddLine(xr, y, xwr, y);
path.AddArc(xwr2, y, xDiameter, yDiameter, 270, 90);
path.AddLine(xw, yr, xw, yhr);
path.AddArc(xwr2, yhr2, xDiameter, yDiameter, 0, 90);
path.AddLine(xwr, yh, xr, yh);
path.AddArc(x, yhr2, xDiameter, yDiameter, 90, 90);
path.AddLine(x, yhr, x, yr);
path.CloseFigure();
return true;
}
public void ImageViewerRubberBandInteractiveMode_Example()
{
ImageViewerRubberBandInteractiveMode rubberBandMode = new ImageViewerRubberBandInteractiveMode();
foreach (ImageViewerRubberBandShape shape in Enum.GetValues(typeof(ImageViewerRubberBandShape)))
_rubberBandShapesComboBox.Items.Add(shape);
_rubberBandShapesComboBox.SelectedItem = rubberBandMode.Shape;
_rubberBandShapesComboBox.SelectedIndexChanged += (sender, e) => rubberBandMode.Shape = (ImageViewerRubberBandShape)_rubberBandShapesComboBox.SelectedItem;
rubberBandMode.RubberBandCompleted += (sender, e) =>
{
if (e.IsCanceled)
return;
if (rubberBandMode.Item == null)
return;
LeadPoint[] points = new LeadPoint[e.Points.Count];
for (var i = 0; i < points.Length; i++)
points[i] = LeadPoint.Create(e.Points[i].X, e.Points[i].Y);
LeadPoint min = LeadPoint.Empty;
LeadPoint max = LeadPoint.Empty;
for (int i = 0; i < points.Length; i++)
{
points[i] = _imageViewer.ConvertPoint(rubberBandMode.Item, ImageViewerCoordinateType.Control, ImageViewerCoordinateType.Image, points[i]);
if (i == 0)
{
min = points[i];
max = points[i];
}
else
{
min.X = Math.Min(min.X, points[i].X);
min.Y = Math.Min(min.Y, points[i].Y);
max.X = Math.Max(max.X, points[i].X);
max.Y = Math.Max(max.Y, points[i].Y);
}
}
LeadPoint center = LeadPoint.Create(min.X + (max.X - min.X) / 2, min.Y + (max.Y - min.Y) / 2);
ImageViewerItem rasterItem = rubberBandMode.Item;
RasterImage image = rasterItem.Image;
IntPtr hdc = RasterImagePainter.CreateLeadDC(image);
using (Graphics graphics = Graphics.FromHdc(hdc))
{
using (GraphicsPath path = new GraphicsPath())
{
switch (rubberBandMode.Shape)
{
case ImageViewerRubberBandShape.Rectangle:
case ImageViewerRubberBandShape.Ellipse:
{
LeadRect rect = LeadRect.Normalize(LeadRect.FromLTRB(points[0].X, points[0].Y, points[1].X, points[1].Y));
Rectangle rc = new Rectangle(rect.X, rect.Y, rect.Width, rect.Height);
if (rubberBandMode.Shape == ImageViewerRubberBandShape.Rectangle)
path.AddRectangle(rc);
else
path.AddEllipse(rc);
}
break;
case ImageViewerRubberBandShape.RoundRectangle:
{
LeadSize radius = rubberBandMode.RoundRectangleRadius;
LeadRect rect = LeadRect.Normalize(LeadRect.FromLTRB(points[0].X, points[0].Y, points[1].X, points[1].Y));
AddRoundRect(path, rect, radius.Width, radius.Height);
}
break;
case ImageViewerRubberBandShape.Freehand:
{
bool firstPoint = true;
LeadPoint lastPoint = LeadPoint.Empty;
foreach (LeadPoint pt in points)
{
if (!firstPoint)
path.AddLine(lastPoint.X, lastPoint.Y, pt.X, pt.Y);
else
firstPoint = false;
lastPoint = pt;
}
}
break;
default:
break;
}
path.CloseFigure();
if (image.Width > 1000 || image.Height > 1000)
{
using (Pen pen = new Pen(Color.Yellow, 8))
graphics.DrawPath(pen, path);
}
else
{
graphics.DrawPath(Pens.Yellow, path);
}
}
}
RasterImagePainter.DeleteLeadDC(hdc);
_imageViewer.Invalidate();
};
rubberBandMode.AutoItemMode = ImageViewerAutoItemMode.AutoSet;
rubberBandMode.ItemPart = ImageViewerItemPart.Image;
_imageViewer.InteractiveModes.BeginUpdate();
_imageViewer.InteractiveModes.Add(rubberBandMode);
ImageViewerAutoPanInteractiveMode autopan = new ImageViewerAutoPanInteractiveMode();
autopan.PanDelay = 100;
_imageViewer.InteractiveModes.Add(autopan);
_imageViewer.InteractiveModes.EndUpdate();
}