←Select platform

ImageViewerRubberBandInteractiveMode Class

Summary

Draws a shape on the viewer.

Syntax
C#
Objective-C
C++/CLI
public class ImageViewerRubberBandInteractiveMode : ImageViewerInteractiveMode 
@interface LTImageViewerRubberBandInteractiveMode : LTImageViewerInteractiveMode<NSCoding> 
public ref class ImageViewerRubberBandInteractiveMode : ImageViewerInteractiveMode 
Remarks

The ImageViewerRubberBandInteractiveMode derives from the ImageViewerInteractiveMode and subscribes to the following events of the InteractiveService:

The ImageViewerRubberBandInteractiveMode works as follows:

  1. When DragStarted is received, InteractiveEventArgs.IsHandled is set to true and Render is called to draw the rubber band Shape, BorderPen, and BackgroundBrush are used to customize the appearance of the shape. The RubberBandStarted event is also fired. Note that you can derive your own class and override Render to customize the rendering of the shape.

  2. When DragDelta is received, InteractiveEventArgs.IsHandled is set to true and Render is called to update the shape. RubberBandDelta is also fired.

  3. When DragCompleted is received, InteractiveEventArgs.IsHandled is set to true and RubberBandCompleted is fired.

The ImageViewerRubberBandInteractiveMode interactive mode does not perform any action on the viewer (besides drawing, moving and then removing the shape). It is up to the user to implement any custom operation required, (for example, to select a region of interest on the image). ImageViewerZoomToInteractiveMode derives from ImageViewerRubberBandInteractiveMode and calls ZoomToRect event. Drawing a rubber-band on the viewer is usually followed by another user operation to perform the action. In most cases, the rubber band is to be restricted on the "work" area. The RestrictToWorkBounds can control this behavior.

For more information, refer to Image Viewer Interactive Modes.

Example

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:

C#
using Leadtools; 
using Leadtools.Controls; 
using Leadtools.Codecs; 
using Leadtools.Drawing; 
 
using Leadtools.ImageProcessing; 
using Leadtools.ImageProcessing.Color; 
 
public ImageViewerForm _form = new ImageViewerForm(); 
public ComboBox _rubberBandShapesComboBox = new ComboBox(); 
public ImageViewer _imageViewer; 
 
public void ImageViewerRubberBandInteractiveModeExample() 
{ 
   // Get the ImageViewer control from the form 
   _imageViewer = _form.ImageViewer; 
 
   // Load an image 
   using (var codecs = new RasterCodecs()) 
      _imageViewer.Image = codecs.Load(Path.Combine(LEAD_VARS.ImagesDir, "image1.cmp")); 
 
   // Add rubber band shape ComboBox to the form 
   _form.Controls.Add(_rubberBandShapesComboBox); 
   _rubberBandShapesComboBox.BringToFront(); 
 
   // Add the shapes to the ComboBox 
   foreach (ImageViewerRubberBandShape shape in Enum.GetValues(typeof(ImageViewerRubberBandShape))) 
      _rubberBandShapesComboBox.Items.Add(shape); 
 
   // Create the interactive mode  
   ImageViewerRubberBandInteractiveMode rubberBandMode = new ImageViewerRubberBandInteractiveMode(); 
   rubberBandMode.BackgroundBrush = null; 
   rubberBandMode.BorderPen = new Pen(Color.FromArgb(0xEF, 128, 128, 0)) { DashStyle = DashStyle.Dash }; 
 
   // Set the default shape as selected in the ComboBox 
   _rubberBandShapesComboBox.SelectedItem = rubberBandMode.Shape; 
 
   // Set the selected ComboBox item as the shape for the interactive mode 
   _rubberBandShapesComboBox.SelectedIndexChanged += (sender, e) => rubberBandMode.Shape = (ImageViewerRubberBandShape)_rubberBandShapesComboBox.SelectedItem; 
 
   //  
   rubberBandMode.RubberBandStarted += (object sender, ImageViewerRubberBandEventArgs e) => 
   { 
      Debug.WriteLine("Rubber-Band started at " + e.Points[0].X + ", " + e.Points[0].Y); 
   }; 
 
   rubberBandMode.RubberBandDelta += (object sender, ImageViewerRubberBandEventArgs e) => 
   { 
      int left = e.Points[0].X; 
      int top = e.Points[0].Y; 
      LeadPoint lastPoint = e.Points[e.Points.Count - 1]; 
      int width = lastPoint.X > left ? lastPoint.X - left : left - lastPoint.X; 
      int height = lastPoint.Y > top ? lastPoint.Y - top : top - lastPoint.Y; 
 
      _form.Text = "Rubber-Band Region: " + left + ", " + top + ", " + width + ", " + height; 
   }; 
 
   // Handle drawing the shape when rubber band selection is complete 
   rubberBandMode.RubberBandCompleted += (object sender, ImageViewerRubberBandEventArgs 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(); 
} 
 
// Draw a round rectangle 
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; 
} 
 
 
static class LEAD_VARS 
{ 
   public const string ImagesDir = @"C:\LEADTOOLS23\Resources\Images"; 
} 
Requirements

Target Platforms

Help Version 23.0.2024.2.29
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2024 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Controls Assembly
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2023 LEAD Technologies, Inc. All Rights Reserved.