Draws a shape on the viewer.
public class ImageViewerRubberBandInteractiveMode : ImageViewerInteractiveMode
Public Class ImageViewerRubberBandInteractiveMode
Inherits ImageViewerInteractiveMode
public ref class ImageViewerRubberBandInteractiveMode : ImageViewerInteractiveMode
ImageViewerRubberBandInteractiveMode derives from ImageViewerInteractiveMode and subscribes to the following events of the InteractiveService:
ImageViewerRubberBandInteractiveMode works as follows:
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.
When DragDelta is received, Render is called to update the shape and RubberBandDelta is fired.
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 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.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();
}
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
Products |
Support |
Feedback: ImageViewerRubberBandInteractiveMode Class - Leadtools.Controls |
Introduction |
Help Version 19.0.2017.6.20
|
Raster .NET | C API | C++ Class Library | JavaScript HTML5
Document .NET | C API | C++ Class Library | JavaScript HTML5
Medical .NET | C API | C++ Class Library | JavaScript HTML5
Medical Web Viewer .NET
Your email has been sent to support! Someone should be in touch! If your matter is urgent please come back into chat.
Chat Hours:
Monday - Friday, 8:30am to 6pm ET
Thank you for your feedback!
Please fill out the form again to start a new chat.
All agents are currently offline.
Chat Hours:
Monday - Friday
8:30AM - 6PM EST
To contact us please fill out this form and we will contact you via email.