ImageViewerRubberBandInteractiveMode Class (original) (raw)

This example will use ImageViewerRubberBandInteractiveMode to select a region of interest in the image. When the user finishes selecting the area, the example will draw a blue with yellow border rectangle on the image.

Start with the ImageViewer example, remove all the code inside the example function (search for the "// TODO: add example code here" comment) and insert the following code:

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