←Select platform

ImageViewerRubberBandInteractiveMode Class


Draws a shape on the viewer.


public class ImageViewerRubberBandInteractiveMode : ImageViewerInteractiveMode 
Public Class ImageViewerRubberBandInteractiveMode 
   Inherits ImageViewerInteractiveMode 
public ref class ImageViewerRubberBandInteractiveMode : ImageViewerInteractiveMode 


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 to draw the rubber band shape Shape, BorderPen, and BackgroundBrush are used to customize the appearance of the shape. The RubberBandStarted event is also fired. Note that if 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.


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 LeadtoolsExamples.Common; 
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.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); 
   return true; 
public void ImageViewerRubberBandInteractiveMode_Example() 
   ImageViewerRubberBandInteractiveMode rubberBandMode = new ImageViewerRubberBandInteractiveMode(); 
   foreach (ImageViewerRubberBandShape shape in Enum.GetValues(typeof(ImageViewerRubberBandShape))) 
   _rubberBandShapesComboBox.SelectedItem = rubberBandMode.Shape; 
   _rubberBandShapesComboBox.SelectedIndexChanged += (sender, e) => rubberBandMode.Shape = (ImageViewerRubberBandShape)_rubberBandShapesComboBox.SelectedItem; 
   rubberBandMode.RubberBandCompleted += (sender, e) => 
      if (e.IsCanceled) 
      if (rubberBandMode.Item == null) 
      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]; 
            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) 
               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); 
               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); 
                           firstPoint = false; 
                        lastPoint = pt; 
            if (image.Width > 1000 || image.Height > 1000) 
               using (Pen pen = new Pen(Color.Yellow, 8)) 
                  graphics.DrawPath(pen, path); 
               graphics.DrawPath(Pens.Yellow, path); 
   rubberBandMode.AutoItemMode = ImageViewerAutoItemMode.AutoSet; 
   rubberBandMode.ItemPart = ImageViewerItemPart.Image; 
   ImageViewerAutoPanInteractiveMode autopan = new ImageViewerAutoPanInteractiveMode(); 
   autopan.PanDelay = 100; 
Imports Leadtools 
Imports Leadtools.Controls 
Imports Leadtools.Codecs 
Imports Leadtools.Drawing 
Imports Leadtools.ImageProcessing 
Imports Leadtools.ImageProcessing.Color 
Public Shared Function AddRoundRect(ByVal path As GraphicsPath, ByVal bounds As LeadRect, ByVal xRadius As Integer, ByVal yRadius As Integer) As Boolean 
   If bounds.Width < 1 OrElse bounds.Height < 1 Then 
      Return False 
   End If 
   If xRadius < 1 OrElse yRadius < 1 Then 
      ' Add a rectangle 
      path.AddRectangle(New Rectangle(bounds.X, bounds.Y, bounds.Width, bounds.Height)) 
      Return True 
   End If 
   Dim x As Integer = bounds.X 
   Dim y As Integer = bounds.Y 
   Dim width As Integer = bounds.Width 
   Dim height As Integer = bounds.Height 
   ' adapt horizontal and vertical diameter if the rectangle is too little 
   Dim xDiameter As Integer = xRadius * 2 
   Dim yDiameter As Integer = yRadius * 2 
   If width < (xDiameter) Then 
      xDiameter = width 
   End If 
   If height < (yDiameter) Then 
      yDiameter = height 
   End If 
   xRadius = xDiameter \ 2 
   yRadius = yDiameter \ 2 
   Dim xw As Integer = x + width 
   Dim yh As Integer = y + height 
   Dim xwr As Integer = xw - xRadius 
   Dim yhr As Integer = yh - yRadius 
   Dim xr As Integer = x + xRadius 
   Dim yr As Integer = y + yRadius 
   Dim xwr2 As Integer = xw - xDiameter 
   Dim yhr2 As Integer = yh - yDiameter 
   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) 
   Return True 
End Function 
Public Sub ImageViewerRubberBandInteractiveMode_Example() 
   Dim rubberBandMode As ImageViewerRubberBandInteractiveMode = New ImageViewerRubberBandInteractiveMode() 
   For Each shape As ImageViewerRubberBandShape In System.Enum.GetValues(GetType(ImageViewerRubberBandShape)) 
   Next shape 
   _rubberBandShapesComboBox.SelectedItem = rubberBandMode.Shape 
   AddHandler _rubberBandShapesComboBox.SelectedIndexChanged, Sub(sender, e) rubberBandMode.Shape = CType(_rubberBandShapesComboBox.SelectedItem, 
   AddHandler rubberBandMode.RubberBandCompleted, 
       Sub(sender, e) 
          If e.IsCanceled Then 
          End If 
          If rubberBandMode.Item Is Nothing Then 
          End If 
          Dim points As LeadPoint() = New LeadPoint(e.Points.Count - 1) {} 
          Dim i As Integer = 0 
          Do While i < points.Length 
             points(i) = LeadPoint.Create(e.Points(i).X, e.Points(i).Y) 
             i += 1 
          Dim min As LeadPoint = LeadPoint.Empty 
          Dim max As LeadPoint = LeadPoint.Empty 
          i = 0 
          Do While i < points.Length 
             points(i) = _imageViewer.ConvertPoint(rubberBandMode.Item, ImageViewerCoordinateType.Control, ImageViewerCoordinateType.Image, points(i)) 
             If i = 0 Then 
                min = points(i) 
                max = points(i) 
                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) 
             End If 
             i += 1 
          Dim center As LeadPoint = LeadPoint.Create(min.X + (max.X - min.X) \ 2, min.Y + (max.Y - min.Y) \ 2) 
          Dim rasterItem As ImageViewerItem = rubberBandMode.Item 
          Dim image As RasterImage = rasterItem.Image 
          Dim hdc As IntPtr = RasterImagePainter.CreateLeadDC(image) 
          Using graphics As Graphics = graphics.FromHdc(hdc) 
             Using path As GraphicsPath = New GraphicsPath() 
                Select Case rubberBandMode.Shape 
                   Case ImageViewerRubberBandShape.Rectangle, ImageViewerRubberBandShape.Ellipse 
                      Dim rect As LeadRect = LeadRect.Normalize(LeadRect.FromLTRB(points(0).X, points(0).Y, points(1).X, points(1).Y)) 
                      Dim rc As Rectangle = New Rectangle(rect.X, rect.Y, rect.Width, rect.Height) 
                      If rubberBandMode.Shape = ImageViewerRubberBandShape.Rectangle Then 
                      End If 
                   Case ImageViewerRubberBandShape.RoundRectangle 
                      Dim radius As LeadSize = rubberBandMode.RoundRectangleRadius 
                      Dim rect As LeadRect = LeadRect.Normalize(LeadRect.FromLTRB(points(0).X, points(0).Y, points(1).X, points(1).Y)) 
                      AddRoundRect(path, rect, radius.Width, radius.Height) 
                   Case ImageViewerRubberBandShape.Freehand 
                      Dim firstPoint As Boolean = True 
                      Dim lastPoint As LeadPoint = LeadPoint.Empty 
                      For Each pt As LeadPoint In points 
                         If (Not firstPoint) Then 
                            path.AddLine(lastPoint.X, lastPoint.Y, pt.X, pt.Y) 
                            firstPoint = False 
                         End If 
                         lastPoint = pt 
                      Next pt 
                   Case Else 
                End Select 
                If image.Width > 1000 OrElse image.Height > 1000 Then 
                   Using pen As Pen = New Pen(Color.Yellow, 8) 
                      graphics.DrawPath(pen, path) 
                   End Using 
                   graphics.DrawPath(Pens.Yellow, path) 
                End If 
             End Using 
          End Using 
       End Sub 
   rubberBandMode.AutoItemMode = ImageViewerAutoItemMode.AutoSet 
   rubberBandMode.ItemPart = ImageViewerItemPart.Image 
   Dim autopan As ImageViewerAutoPanInteractiveMode = New ImageViewerAutoPanInteractiveMode() 
   autopan.PanDelay = 100 
End Sub 


Target Platforms

Help Version 19.0.2017.10.27
Products | Support | Contact Us | Copyright Notices
© 1991-2017 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Controls.WinForms Assembly