Return the transform of the viewer taking into account the DPI of the image.
public Matrix GetTransformWithDpi()
Public Function GetTransformWithDpi() As Matrix
public:
Matrix^ GetTransformWithDpi();
A System.Drawing.Drawing2D.Matrix object containing the values of the transform of the viewer taking into account the DPI of the image
Use this instead of the Transform property when the value of the UseDpi property is set to true.
If the value of the UseDpi property is false, then the return value of this method is an exact copy of the Transform matrix.
Note, since this method returns a copy of the matrix used inside this RasterImageViewer object, you need to call Matrix.Dispose on the return object.
This example use the GetTransformWithDpi method to perform rubber band selection on a RasterImageViewer.
using Leadtools.WinForms;
using Leadtools;
using Leadtools.Codecs;
using Leadtools.ImageProcessing.Color;
using Leadtools.Drawing;
class MyForm4 : Form
{
private RasterImageViewer _viewer;
// Are we currently rubber banding
private bool isRubberBanding;
// The current rubberband rectangle
private Rectangle rubberBandingRectangle;
// Flag to indicates if the rubber band rectangle is drawn
private bool isRubberBandingRectangleDrawn;
// Did we clicp the cursor?
private bool isCursorClipped;
private Rectangle saveClipRectangle;
public MyForm4(string title)
{
Text = title;
Size = new Size(750, 450);
// Create the raster viewer
_viewer = new RasterImageViewer();
_viewer.DoubleBuffer = true;
_viewer.Dock = DockStyle.Fill;
// Load an image into the viewer
RasterCodecs codecs = new RasterCodecs();
_viewer.Image = codecs.Load(Path.Combine(LEAD_VARS.ImagesDir, "Sample1.cmp"));
codecs.Dispose();
Controls.Add(_viewer);
_viewer.BringToFront();
StartRubberBanding();
}
// Call this to start rubber banding on the viewer
private void StartRubberBanding()
{
// Subclass to the event we need
_viewer.MouseDown += new MouseEventHandler(_viewer_MouseDown);
_viewer.MouseMove += new MouseEventHandler(_viewer_MouseMove);
_viewer.MouseUp += new MouseEventHandler(_viewer_MouseUp);
_viewer.LostFocus += new EventHandler(_viewer_LostFocus);
}
// Call this to stop rubber banding on the viewer
private void StopRubberBanding()
{
// Un-subclass to the events
_viewer.MouseDown -= new MouseEventHandler(_viewer_MouseDown);
_viewer.MouseMove -= new MouseEventHandler(_viewer_MouseMove);
_viewer.MouseUp -= new MouseEventHandler(_viewer_MouseUp);
_viewer.LostFocus -= new EventHandler(_viewer_LostFocus);
isRubberBanding = false;
rubberBandingRectangle = Rectangle.Empty;
isRubberBandingRectangleDrawn = false;
isCursorClipped = false;
saveClipRectangle = Rectangle.Empty;
}
// Begins the rubber banding operation
private void BeginRubberBanding(int x, int y)
{
rubberBandingRectangle = Rectangle.FromLTRB(x, y, x, y);
isRubberBanding = true;
_viewer.Capture = true;
// Clip the cursor
ClipCursor(true);
DrawRubberBandRectangle();
}
// Ends the rubber banding
private void EndRubberBanding()
{
_viewer.Capture = false;
isRubberBanding = false;
if (isRubberBandingRectangleDrawn)
DrawRubberBandRectangle();
if (isCursorClipped)
ClipCursor(false);
}
private void ClipCursor(bool clip)
{
if (clip)
{
Rectangle rect = Rectangle.Intersect(FixRectangle(_viewer.PhysicalViewRectangle), _viewer.ClientRectangle);
rect = _viewer.RectangleToScreen(rect);
Control parent = _viewer.Parent;
while (parent != null)
{
rect = Rectangle.Intersect(rect, _viewer.Parent.RectangleToScreen(_viewer.Parent.ClientRectangle));
if (parent is Form)
{
Form form = parent as Form;
if (form.IsMdiChild)
{
if (form.Owner != null)
rect = Rectangle.Intersect(rect, form.Owner.RectangleToScreen(form.Owner.ClientRectangle));
else if (form.Parent != null)
rect = Rectangle.Intersect(rect, form.Parent.RectangleToScreen(form.Parent.ClientRectangle));
}
}
parent = parent.Parent;
}
rect.Height += 1;
rect.Width += 1;
saveClipRectangle = Cursor.Clip;
Cursor.Clip = rect;
isCursorClipped = true;
}
else
{
Cursor.Clip = saveClipRectangle;
isCursorClipped = false;
saveClipRectangle = Rectangle.Empty;
}
}
private static Rectangle FixRectangle(Rectangle rect)
{
if (rect.Left > rect.Right)
rect = Rectangle.FromLTRB(rect.Right, rect.Top, rect.Left, rect.Bottom);
if (rect.Top > rect.Bottom)
rect = Rectangle.FromLTRB(rect.Left, rect.Bottom, rect.Right, rect.Top);
return rect;
}
// Draws the rubberband rectangle on the viewer
private void DrawRubberBandRectangle()
{
Rectangle rect = FixRectangle(rubberBandingRectangle);
rect.Width++;
rect.Height++;
rect = _viewer.RectangleToScreen(rect);
ControlPaint.DrawReversibleFrame(rect, Color.Transparent, FrameStyle.Thick);
isRubberBandingRectangleDrawn = !isRubberBandingRectangleDrawn;
}
private void _viewer_MouseDown(object sender, MouseEventArgs e)
{
_viewer.Focus();
// Cancel rubber banding if it is on
if (isRubberBanding)
EndRubberBanding();
else
{
if (_viewer.IsImageAvailable && e.Button == MouseButtons.Left)
{
// See if we click is on the image
Rectangle rect = _viewer.PhysicalViewRectangle;
if (rect.Contains(e.X, e.Y))
{
// Start the rubber banding
BeginRubberBanding(e.X, e.Y);
}
}
}
}
private void _viewer_MouseMove(object sender, MouseEventArgs e)
{
if (isRubberBanding)
{
DrawRubberBandRectangle();
rubberBandingRectangle = Rectangle.FromLTRB(
rubberBandingRectangle.Left,
rubberBandingRectangle.Top,
e.X,
e.Y);
DrawRubberBandRectangle();
}
}
private void _viewer_MouseUp(object sender, MouseEventArgs e)
{
if (isRubberBanding)
{
// Save the rubberband rectangle
Rectangle rect = rubberBandingRectangle;
EndRubberBanding();
// First, convert the rectangle to image coordinates
rect = FixRectangle(rect);
// Must be at least 1 pixel in size
if (rect.Width > 1 && rect.Height > 1)
{
// Get the transform matrix
// This works even if the UseDpi property of the viewer is set to true
using (Matrix transform = _viewer.GetTransformWithDpi())
{
Transformer t = new Transformer(transform);
rect = Rectangle.Round(t.RectangleToLogical(rect));
LeadRect lrect = new LeadRect(rect.Left, rect.Top, rect.Width, rect.Height);
lrect = _viewer.Image.RectangleToImage(RasterViewPerspective.TopLeft, lrect);
// Add this rectangle as a region
// Note: no conversion or xform is needed
_viewer.Image.AddRectangleToRegion(null, lrect, RasterRegionCombineMode.Set);
}
}
}
}
private void _viewer_LostFocus(object sender, EventArgs e)
{
if (isRubberBanding)
{
EndRubberBanding();
}
}
}
static class LEAD_VARS
{
public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images";
}
Imports Leadtools.WinForms
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.ImageProcessing.Color
Imports Leadtools.Drawing
Friend Class MyForm4 : Inherits Form
Private _viewer As RasterImageViewer
' Are we currently rubber banding
Private isRubberBanding As Boolean
' The current rubberband rectangle
Private rubberBandingRectangle As Rectangle
' Flag to indicates if the rubber band rectangle is drawn
Private isRubberBandingRectangleDrawn As Boolean
' Did we clicp the cursor?
Private isCursorClipped As Boolean
Private saveClipRectangle As Rectangle
Public Sub New(ByVal title As String)
Text = title
Size = New Size(750, 450)
' Create the raster viewer
_viewer = New RasterImageViewer()
_viewer.DoubleBuffer = True
_viewer.Dock = DockStyle.Fill
' Load an image into the viewer
Dim codecs As RasterCodecs = New RasterCodecs()
_viewer.Image = codecs.Load(Path.Combine(LEAD_VARS.ImagesDir, "Sample1.cmp"))
codecs.Dispose()
Controls.Add(_viewer)
_viewer.BringToFront()
StartRubberBanding()
End Sub
' Call this to start rubber banding on the viewer
Private Sub StartRubberBanding()
' Subclass to the event we need
AddHandler _viewer.MouseDown, AddressOf _viewer_MouseDown
AddHandler _viewer.MouseMove, AddressOf _viewer_MouseMove
AddHandler _viewer.MouseUp, AddressOf _viewer_MouseUp
AddHandler _viewer.LostFocus, AddressOf _viewer_LostFocus
End Sub
' Call this to stop rubber banding on the viewer
Private Sub StopRubberBanding()
' Un-subclass to the events
RemoveHandler _viewer.MouseDown, AddressOf _viewer_MouseDown
RemoveHandler _viewer.MouseMove, AddressOf _viewer_MouseMove
RemoveHandler _viewer.MouseUp, AddressOf _viewer_MouseUp
RemoveHandler _viewer.LostFocus, AddressOf _viewer_LostFocus
isRubberBanding = False
rubberBandingRectangle = Rectangle.Empty
isRubberBandingRectangleDrawn = False
isCursorClipped = False
saveClipRectangle = Rectangle.Empty
End Sub
' Begins the rubber banding operation
Private Sub BeginRubberBanding(ByVal x As Integer, ByVal y As Integer)
rubberBandingRectangle = Rectangle.FromLTRB(x, y, x, y)
isRubberBanding = True
_viewer.Capture = True
' Clip the cursor
ClipCursor(True)
DrawRubberBandRectangle()
End Sub
' Ends the rubber banding
Private Sub EndRubberBanding()
_viewer.Capture = False
isRubberBanding = False
If isRubberBandingRectangleDrawn Then
DrawRubberBandRectangle()
End If
If isCursorClipped Then
ClipCursor(False)
End If
End Sub
Private Sub ClipCursor(ByVal clip As Boolean)
If clip Then
Dim rect As Rectangle = Rectangle.Intersect(FixRectangle(_viewer.PhysicalViewRectangle), _viewer.ClientRectangle)
rect = _viewer.RectangleToScreen(rect)
Dim parent As Control = _viewer.Parent
Do While Not parent Is Nothing
rect = Rectangle.Intersect(rect, _viewer.Parent.RectangleToScreen(_viewer.Parent.ClientRectangle))
If TypeOf parent Is Form Then
Dim form As Form = TryCast(parent, Form)
If form.IsMdiChild Then
If Not form.Owner Is Nothing Then
rect = Rectangle.Intersect(rect, form.Owner.RectangleToScreen(form.Owner.ClientRectangle))
ElseIf Not form.Parent Is Nothing Then
rect = Rectangle.Intersect(rect, form.Parent.RectangleToScreen(form.Parent.ClientRectangle))
End If
End If
End If
parent = parent.Parent
Loop
rect.Height += 1
rect.Width += 1
saveClipRectangle = Cursor.Clip
Cursor.Clip = rect
isCursorClipped = True
Else
Cursor.Clip = saveClipRectangle
isCursorClipped = False
saveClipRectangle = Rectangle.Empty
End If
End Sub
Private Shared Function FixRectangle(ByVal rect As Rectangle) As Rectangle
If rect.Left > rect.Right Then
rect = Rectangle.FromLTRB(rect.Right, rect.Top, rect.Left, rect.Bottom)
End If
If rect.Top > rect.Bottom Then
rect = Rectangle.FromLTRB(rect.Left, rect.Bottom, rect.Right, rect.Top)
End If
Return rect
End Function
' Draws the rubberband rectangle on the viewer
Private Sub DrawRubberBandRectangle()
Dim rect As Rectangle = FixRectangle(rubberBandingRectangle)
rect.Width += 1
rect.Height += 1
rect = _viewer.RectangleToScreen(rect)
ControlPaint.DrawReversibleFrame(rect, Color.Transparent, FrameStyle.Thick)
isRubberBandingRectangleDrawn = Not isRubberBandingRectangleDrawn
End Sub
Private Sub _viewer_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
_viewer.Focus()
' Cancel rubber banding if it is on
If isRubberBanding Then
EndRubberBanding()
Else
If _viewer.IsImageAvailable AndAlso e.Button = MouseButtons.Left Then
' See if we click is on the image
Dim rect As Rectangle = _viewer.PhysicalViewRectangle
If rect.Contains(e.X, e.Y) Then
' Start the rubber banding
BeginRubberBanding(e.X, e.Y)
End If
End If
End If
End Sub
Private Sub _viewer_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
If isRubberBanding Then
DrawRubberBandRectangle()
rubberBandingRectangle = Rectangle.FromLTRB(rubberBandingRectangle.Left, rubberBandingRectangle.Top, e.X, e.Y)
DrawRubberBandRectangle()
End If
End Sub
Private Sub _viewer_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
If isRubberBanding Then
' Save the rubberband rectangle
Dim rect As Rectangle = rubberBandingRectangle
EndRubberBanding()
' First, convert the rectangle to image coordinates
rect = FixRectangle(rect)
' Must be at least 1 pixel in size
If rect.Width > 1 AndAlso rect.Height > 1 Then
' Get the transform matrix
' This works even if the UseDpi property of the viewer is set to true
Using transform As Matrix = _viewer.GetTransformWithDpi()
Dim t As Transformer = New Transformer(transform)
rect = Rectangle.Round(t.RectangleToLogical(rect))
Dim lrect As LeadRect = New LeadRect(rect.Left, rect.Top, rect.Width, rect.Height)
' Add this rectangle as a region
' Note: no conversion or xform is needed
_viewer.Image.AddRectangleToRegion(Nothing, lrect, RasterRegionCombineMode.Set)
End Using
End If
End If
End Sub
Private Sub _viewer_LostFocus(ByVal sender As Object, ByVal e As EventArgs)
If isRubberBanding Then
EndRubberBanding()
End If
End Sub
End Class
Public NotInheritable Class LEAD_VARS
Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images"
End Class
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