←Select platform

GetTransformWithDpi Method

Summary

Return the transform of the viewer taking into account the DPI of the image.

Syntax

C#
VB
C++
public Matrix GetTransformWithDpi() 
  
Public Function GetTransformWithDpi() As Matrix 
public: 
Matrix^ GetTransformWithDpi();  

Return Value

A System.Drawing.Drawing2D.Matrix object containing the values of the transform of the viewer taking into account the DPI of the image

Remarks

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.

Example

This example use the GetTransformWithDpi method to perform rubber band selection on a RasterImageViewer.

C#
VB
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 

Requirements

Target Platforms

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

Leadtools.WinForms Assembly