Error processing SSI file
(Leadtools.Controls)

Show in webframe

ImageViewerRubberBandInteractiveMode Class




Members 
Draws a shape on the viewer.
Object Model
Syntax
public class ImageViewerRubberBandInteractiveMode : ImageViewerInteractiveMode 
'Declaration
 
Public Class ImageViewerRubberBandInteractiveMode 
   Inherits ImageViewerInteractiveMode
Remarks

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

ImageViewerRubberBandInteractiveMode works as follows:

  1. When DragStarted is received, Render is called to to draw the rubber band shape. The following properties are used to customize the appearance of this shape: ShapeBorderPen, BackgroundBrush and the event RubberBandStarted is 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, Render is called to update the shape and RubberBandDelta is fired.

  3. When DragCompleted is received, RubberBandCompleted is fired.

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 ImageViewer.ZoomToRect upon the receiving of RubberBandCompleted 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:

Copy Code  
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.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
     End Function

     <TestMethod>
     Public Sub ImageViewerRubberBandInteractiveMode_Example()
        Dim rubberBandMode As ImageViewerRubberBandInteractiveMode = New ImageViewerRubberBandInteractiveMode()

        For Each shape As ImageViewerRubberBandShape In System.Enum.GetValues(GetType(ImageViewerRubberBandShape))
           _rubberBandShapesComboBox.Items.Add(shape)
        Next shape

        _rubberBandShapesComboBox.SelectedItem = rubberBandMode.Shape

        AddHandler _rubberBandShapesComboBox.SelectedIndexChanged, Sub(sender, e) rubberBandMode.Shape = CType(_rubberBandShapesComboBox.SelectedItem,  _
ImageViewerRubberBandShape)

        AddHandler rubberBandMode.RubberBandCompleted,
            Sub(sender, e)
               If e.IsCanceled Then
                  Return
               End If

               If rubberBandMode.Item Is Nothing Then
                  Return
               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
               Loop

               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)
                  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)
                  End If
                  i += 1
               Loop

               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
                              path.AddRectangle(rc)
                           Else
                              path.AddEllipse(rc)
                           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)
                              Else
                                 firstPoint = False
                              End If

                              lastPoint = pt
                           Next pt

                        Case Else
                     End Select

                     path.CloseFigure()

                     If image.Width > 1000 OrElse image.Height > 1000 Then
                        Using pen As Pen = New Pen(Color.Yellow, 8)
                           graphics.DrawPath(pen, path)
                        End Using
                     Else
                        graphics.DrawPath(Pens.Yellow, path)
                     End If
                  End Using
               End Using

               RasterImagePainter.DeleteLeadDC(hdc)
               _imageViewer.Invalidate()
            End Sub

        rubberBandMode.AutoItemMode = ImageViewerAutoItemMode.AutoSet
        rubberBandMode.ItemPart = ImageViewerItemPart.Image
        _imageViewer.InteractiveModes.BeginUpdate()
        _imageViewer.InteractiveModes.Add(rubberBandMode)
        Dim autopan As ImageViewerAutoPanInteractiveMode = New ImageViewerAutoPanInteractiveMode()
        autopan.PanDelay = 100
        _imageViewer.InteractiveModes.Add(autopan)
        _imageViewer.InteractiveModes.EndUpdate()
     End Sub
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;
}

[TestMethod]
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();
}
Requirements

Target Platforms

See Also

Reference

ImageViewerRubberBandInteractiveMode Members
Leadtools.Controls Namespace

Error processing SSI file