(Leadtools.Controls)

フレームを表示

Zoomメソッド(ImageViewer)




使用するサイズモード。
目的のズーム値。これは、0より大きい値でなければなりません。1.0の値は100パーセントのズーム、0.5の値は50パーセント、1.5の値は150パーセントに等しい、等です。値は現在のMinimumScaleFactor値以上でなければならなくて、現在のMaximumScaleFactor値以下でなければなりません。
ズーム操作の原点。
ビューのサイズモードを拡大縮小するか変更します。
構文
public virtual void Zoom( 
   ControlSizeMode sizeMode,
   double zoomValue,
   LeadPoint origin
)
'Declaration
 
Public Overridable Sub Zoom( _
   ByVal sizeMode As ControlSizeMode, _
   ByVal zoomValue As Double, _
   ByVal origin As LeadPoint _
) 

パラメーター

sizeMode
使用するサイズモード。
zoomValue
目的のズーム値。これは、0より大きい値でなければなりません。1.0の値は100パーセントのズーム、0.5の値は50パーセント、1.5の値は150パーセントに等しい、等です。値は現在のMinimumScaleFactor値以上でなければならなくて、現在のMaximumScaleFactor値以下でなければなりません。
原点
ズーム操作の原点。
解説

「ビュー」サイズはUpdateTransformによって計算されて、ViewSizeで保存されます。それは、以下のように現在のViewLayoutによって制御されます:

ビューレイアウト 説明
ImageViewerSingleViewLayout

表示サイズは現在のActiveItemのサイズです。Fit Page操作では、アクティブな項目をビューワ内に合わせます。Fit Width操作では、アクティブな項目の幅をビューワ内に合わせます。

ImageViewerVerticalViewLayout

表示サイズは列数のに依存します。たとえば、列数が0の場合、ビューのレイアウトでは、次の行に移動する前に、項目をビューワに水平にできるだけぴったり収まるようにします。カラム数がそれ以外の場合、次の行に移動する前に、コラムを項目の数ぴったりに合わせます。ビューの幅は、いずれの列においても項目の最大全幅です。ビューの高さは、すべての行の全高さです。

ImageViewerHorizontalViewLayout

表示サイズは行のに依存します。たとえば、行数が0の場合、ビューのレイアウトでは、次の行に移動する前に、項目をビューワに垂直にできるだけぴったり収まるようにします。カラム数がそれ以外の場合、次の列に移動する前に、行を項目の数ぴったりに合わせます。ビューの高さは、いずれの行においても項目の最大全高さです。ビューの幅は、すべてのコラムの全幅です。

以下の要因は、ビューの現在のズーム値に影響を及ぼします:

上記の組み合わせの結果、実際のXとYの拡大縮小値になります(たとえばサイズモードがControlSizeMode.Stretchであるならば、様々です)。これらの値は、読み取り専用のXScaleFactorとYScaleFactorからいつでも取得できます。アプリケーションでStretchサイズモードを使用しない場合はScaleFactorを使用できます。これは、xおよびy方向の倍率のうち大きい方を返すヘルパープロパティです(stretch以外のサイズモードでは両方向の倍率は同じになります)。

たとえば、ビューを現在のビューワ領域に合わせるには、次を使います。sizeMode = ControlSizeMode.FitzoomValue = 1。サイズが制御サイズより大きいならば、ビューワはフィットにするためにビューをズームアウトするかもしれません。それゆえに、実際の倍率(メソッドが返ったあと、ScaleFactorで保存されます)は、1でなく、1未満の値です。ビューワは、画像全体をズームアウトしなければなりません。

例:

ビューワを拡大縮小表示するには、現在の倍率を取得し増減値で乗算します。たとえば、ビューワを200%拡大表示する(2倍大きく見せる)には、以下を使います。


            // Multiply the current scale factor by two
            viewer.Zoom(ControlSizeMode.None, viewer.ScaleFactor * 2.0, viewer.DefaultZoomOrigin);
            

以下は、50%(半分の大きさにする)、ビューワをズームアウトします


            // Multiply the current scale factor by half
            viewer.Zoom(ControlSizeMode.None, viewer.ScaleFactor * 0.5, viewer.DefaultZoomOrigin);
            

50%(1.5倍の大きさにする)(使用)ビューワをズームインすること:


            // Multiply the current scale factor by one and a half
            viewer.Zoom(ControlSizeMode.None, viewer.ScaleFactor * 1.5, viewer.DefaultZoomOrigin);
            

そして、25%(4分の1の大きさにする)、ビューワをズームアウトします


            // Multiply the current scale factor by quarter
            viewer.Zoom(ControlSizeMode.None, viewer.ScaleFactor * 0.25, viewer.DefaultZoomOrigin);
            

様々なサイズモードを使用することもできます。たとえば全景を現在のビューワに合わせるには、以下を使います。


            viewer.Zoom(ControlSizeMode.Fit, 1.0, viewer.DefaultZoomOrigin);
            

ここで、倍率として1.0(つまり100%)渡しています。ビューワは、"FIT"を実行するために必要な実際のスケール値を計算するためです。同様に以下は、アスペクト比を維持しつつビューワ全体のの水平方向空間を取るようビュー幅を合わせます。


            viewer.Zoom(ControlSizeMode.FitWidth, 1.0, viewer.DefaultZoomOrigin);
            

すべてのControlSizeModeのものサポートにより、任意のサイズに合わせてズームを適用します。


            viewer.Zoom(ControlSizeMode.Fit, 2.0, viewer.DefaultZoomOrigin);
            

ビューを利用可能なビューワスペースにフィットさせ、2で拡大縮小します。

上記のすべてのサイズモードは、ビューのアスペクト比を維持管理します。そのため、XScaleFactorYScaleFactorの値は同じになります。しかし、ビューをコントロール領域に合わせて各方向を塗りつぶすよう拡張する場合は、以下を使います。


            viewer.Zoom(ControlSizeMode.Stretch, 1.0, viewer.DefaultZoomOrigin);
            

そしてこれは多くの場合、XScaleFactorYScaleFactorの値が異なるという結果になります。

zoomValueは、MinimumScaleFactorMaximumScaleFactor間の値でなければなりません。デフォルト値は、より小さいかより大きな法的倍率値をサポートするために変更されることができます。ただしズームはフレームワークの別の部分(ImageViewerPanZoomInteractiveMode等)によって呼び出されるので、デフォルトのカットオフ値が必要で、ビューワはユーザー制御値の外側にズームしません。最小範囲と最大範囲を超えてzoomValue値を渡しても影響はなく無視されます。

ズームを呼び出してScaleFactorまたはSizeModeの値を変更するたびに、UpdateTransformを内部的に呼び出してビューワ上に要求されたとおりにビューと項目を配置して描画するために必要な変換行列とビューのレイアウトが再計算されます。項目とイメージのためのマトリックスがGetItemTransformまたはGetItemImageTransformを使ってアップデートされることができる間、ビュー変換行列はViewTransformで保存されます。

sizeModeの値は、内部的にビューワによって保存されます(SizeModeに)。ビューワでは、ビューワのサイズが変更されるたびに任意のビューサイズを自動的に再計算します。

通常、ImageViewerコントロールを使って画像を表示する方法は2通りあります。

最初のタイプのアプリケーションでは、任意のサイズモードとズーム値1.0を指定してズームを一度呼び出します。ビューワコントロールサイズが変更するときはいつでも、サイズモードはビューワによって保存されて、適用されます。

2つめのタイプのアプリケーションでは、必要な情報を指定して必要な回数だけズームを呼び出します。これらのアプリケーションは、必要に応じてサイズモードを設定する方法だけでなくズームインアウトボタンを通常持っています。

Zoomメソッドは、更新の問題に対処するだけでなく、ズーム操作の原点も指定できます。DefaultZoomOriginは、ほとんどの場合使用できます。これは、ViewHorizontalAlignmentViewVerticalAlignmentの値によって定義されます。たとえば、ViewHorizontalAlignmentControlAlignment.Nearであるとき、ズーム原点のX値はビューの左端です。ControlAlignment.Centerで、それはビュー幅の中心にあります。ControlAlignment.Nearで最後に、それはビューの右端にあります。ズーム原点は同様にViewVerticalAlignmentで機能し、ビューの上、中央および下端を使います。

ImageViewerPanZoomInteractiveModeImageViewerZoomAtInteractiveModeモードは、行動を実行するために、このメソッドを使います。

詳細は、画像ビューワ外観画像ビューワの変換画像ビューワの境界と変換画像ビューワのレイアウト画像ビューワのレンダリングを参照します。

サンプル

以下のサンプルは、Adobe Acrobat Readerなどの一般的なドキュメントビューワによく似たズーム操作を実装します。

Copy Code  
Imports Leadtools
Imports Leadtools.Controls
Imports Leadtools.Codecs
Imports Leadtools.Drawing
Imports Leadtools.ImageProcessing
Imports Leadtools.ImageProcessing.Color

<TestMethod>
Public Sub ImageViewerZoom_Example()
   ' Create the form that holds the ImageViewer
   CType(New MyForm2(), MyForm2).ShowDialog()
End Sub
Private Class MyForm2 : Inherits Form
   Public Sub New()
      Me.Size = New Size(800, 800)
   End Sub

   ' LEADTOOLS ImageViewer to be used with this example
   Private _imageViewer As ImageViewer
   ' Ratio to use when the user zooms in or out. Change this if another value is needed,
   ' for example, 2.0 will zoom the viewer in by 200% and out by 50% each time
   Private Const _zoomRatio As Double = 1.2

   Protected Overrides Sub OnLoad(ByVal e As EventArgs)
      ' Create a panel to the top
      Dim panel As New Panel()
      panel.Dock = DockStyle.Top
      panel.BorderStyle = BorderStyle.FixedSingle
      Me.Controls.Add(panel)

      ' Add a combo box for the zoom values
      Dim zoomComboBox As New ComboBox()
      zoomComboBox.Name = "zoomComboBox"
      zoomComboBox.Location = New Point(8, 8)
      zoomComboBox.DropDownStyle = ComboBoxStyle.DropDown

      ' Add default zoom values
      zoomComboBox.Items.AddRange(New String() {"10%", "25%", "50%", "75%", "100%", "125%", _
                                                "200%", "400%", "800%", "1600%", "2400%", _
                                                "3200%", "6400%", "Actual Size", "Fit Page", "Fit Width", "Fit Height"})
      panel.Controls.Add(zoomComboBox)

      ' Add zoom in and out buttons
      Dim zoomInButton As New Button()
      zoomInButton.Text = "+"
      zoomInButton.Location = New Point(zoomComboBox.Right + 8, zoomComboBox.Top - 1)
      panel.Controls.Add(zoomInButton)
      Dim zoomOutButton As New Button()
      zoomOutButton.Text = "-"
      zoomOutButton.Location = New Point(zoomInButton.Right + 2, zoomComboBox.Top - 1)
      panel.Controls.Add(zoomOutButton)

      ' Create the image viewer taking the rest of the form
      _imageViewer = New ImageViewer()
      _imageViewer.Dock = DockStyle.Fill
      _imageViewer.ViewBorderThickness = 1
      Me.Controls.Add(_imageViewer)
      _imageViewer.BringToFront()

      ' Set UseDpi to true to view the image at its original resolution
      _imageViewer.UseDpi = True

      ' Add Pan/Zoom interactive mode
      ' Click and drag to pan, CTRL-Click and drag to zoom in and out
      _imageViewer.DefaultInteractiveMode = New ImageViewerPanZoomInteractiveMode()

      ' Initialize the zoom system
      InitZoom(zoomComboBox, zoomInButton, zoomOutButton)

      ' Load an image
      Using codecs As New RasterCodecs()
         _imageViewer.Image = codecs.Load(Path.Combine(ImagesPath.Path, "Ocr1.tif"))
      End Using

      MyBase.OnLoad(e)
   End Sub

   Private Sub UpdateZoomValueFromView()
      ' Get the current scale factor from the viewer and set it in the zoom combo box
      Dim percentage As Double = _imageViewer.ScaleFactor * 100.0
      Dim zoomComboBox As ComboBox = TryCast(Me.Controls.Find("zoomComboBox", True)(0), ComboBox)
      zoomComboBox.Text = percentage.ToString("F1") & "%"
   End Sub

   Private Sub InitZoom(ByVal zoomComboBox As ComboBox, ByVal zoomInButton As Button, ByVal zoomOutButton As Button)
      ' Add support for user typing the zoom value in the combo box directly
      AddHandler zoomComboBox.LostFocus,
         Sub(sender, e)
            ' When the user moves away from the combo box, make sure it has a valid value
            UpdateZoomValueFromView()
         End Sub

      AddHandler zoomComboBox.KeyPress,
         Sub(sender, e)
            ' Check if the finished editing by pressing Enter
            If e.KeyChar = ChrW(Keys.Return) Then
               ' Yes, get the new value
               Dim value As String = zoomComboBox.Text.Trim()
               If (Not String.IsNullOrEmpty(value)) Then
                  ' Remove the % sign if present
                  If value.EndsWith("%") Then
                     value = value.Remove(value.Length - 1, 1).Trim()
                  End If

                  ' Try to parse the new zoom value
                  Dim percentage As Double
                  If Double.TryParse(value, percentage) Then
                     ' Valid value, zoom the viewer
                     _imageViewer.Zoom(ControlSizeMode.None, percentage / 100.0, _imageViewer.DefaultZoomOrigin)
                  End If

                  ' And update the combo box from this value (in case we set a value not in the min/max range)
                  UpdateZoomValueFromView()
               End If
            End If
         End Sub

      AddHandler zoomComboBox.SelectedIndexChanged,
         Sub(sender, e)
            ' Get the value from the combo box
            Dim value As String = zoomComboBox.Text.Trim()
            Select Case value
               Case "Actual Size"
                  _imageViewer.Zoom(ControlSizeMode.ActualSize, 1, _imageViewer.DefaultZoomOrigin)

               Case "Fit Page"
                  _imageViewer.Zoom(ControlSizeMode.FitAlways, 1, _imageViewer.DefaultZoomOrigin)

               Case "Fit Width"
                  _imageViewer.Zoom(ControlSizeMode.FitWidth, 1, _imageViewer.DefaultZoomOrigin)

               Case "Fit Height"
                  _imageViewer.Zoom(ControlSizeMode.FitHeight, 1, _imageViewer.DefaultZoomOrigin)

               Case Else
                  If (Not String.IsNullOrEmpty(value)) Then
                     ' A percentage, use it
                     Dim percentage As Double = Double.Parse(value.Substring(0, value.Length - 1))
                     _imageViewer.Zoom(ControlSizeMode.None, percentage / 100.0, _imageViewer.DefaultZoomOrigin)
                  End If
            End Select
         End Sub

      ' For zoom in button, use current ScaleFactor multiplied by the ratio
      AddHandler zoomInButton.Click,
         Sub(sender, e)
            _imageViewer.Zoom(ControlSizeMode.None, _imageViewer.ScaleFactor * _zoomRatio, _imageViewer.DefaultZoomOrigin)
         End Sub

      ' For zoom out button, use current ScaleFactor divided by the ratio
      AddHandler zoomOutButton.Click,
         Sub(sender, e)
            _imageViewer.Zoom(ControlSizeMode.None, _imageViewer.ScaleFactor / _zoomRatio, _imageViewer.DefaultZoomOrigin)
         End Sub

      ' Also update the value from the viewer when the transform changed, this happens if the user selects a fit mode,
      ' such as fit width or fit page. The viewer will change the scale factor accordingly and we need to update it
      ' in our combo box
      ' This also takes care of Pan/Zoom interactive mode updating the scale factor
      AddHandler _imageViewer.TransformChanged,
         Sub(sender, e)
            UpdateZoomValueFromView()
         End Sub

      ' Get the value from the viewer into the combo box
      UpdateZoomValueFromView()
   End Sub
End Class
using Leadtools;
using Leadtools.Controls;
using Leadtools.Codecs;
using Leadtools.Drawing;
using Leadtools.ImageProcessing;
using Leadtools.ImageProcessing.Color;

public void ImageViewerZoom_Example()
{
   // Create the form that holds the ImageViewer
   new MyForm2().ShowDialog();
}
class MyForm2 : Form
{
   public MyForm2()
   {
      this.Size = new Size(800, 800);
   }

   // LEADTOOLS ImageViewer to be used with this example
   private ImageViewer _imageViewer;
   // Ratio to use when the user zooms in or out. Change this if another value is needed,
   // for example, 2.0 will zoom the viewer in by 200% and out by 50% each time
   private const double _zoomRatio = 1.2;

   protected override void OnLoad(EventArgs e)
   {
      // Create a panel to the top
      var panel = new Panel();
      panel.Dock = DockStyle.Top;
      panel.BorderStyle = BorderStyle.FixedSingle;
      this.Controls.Add(panel);

      // Add a combo box for the zoom values
      var zoomComboBox = new ComboBox();
      zoomComboBox.Name = "zoomComboBox";
      zoomComboBox.Location = new Point(8, 8);
      zoomComboBox.DropDownStyle = ComboBoxStyle.DropDown;

      // Add default zoom values
      zoomComboBox.Items.AddRange(new string[]
      {
         "10%", "25%", "50%", "75%", "100%", "125%", "200%", "400%", "800%",
         "1600%", "2400%", "3200%", "6400%", "Actual Size", "Fit Page", "Fit Width", "Fit Height"
      });
      panel.Controls.Add(zoomComboBox);

      // Add zoom in and out buttons
      var zoomInButton = new Button();
      zoomInButton.Text = "+";
      zoomInButton.Location = new Point(zoomComboBox.Right + 8, zoomComboBox.Top - 1);
      panel.Controls.Add(zoomInButton);
      var zoomOutButton = new Button();
      zoomOutButton.Text = "-";
      zoomOutButton.Location = new Point(zoomInButton.Right + 2, zoomComboBox.Top - 1);
      panel.Controls.Add(zoomOutButton);

      // Create the image viewer taking the rest of the form
      _imageViewer = new ImageViewer();
      _imageViewer.Dock = DockStyle.Fill;
      _imageViewer.ViewBorderThickness = 1;
      this.Controls.Add(_imageViewer);
      _imageViewer.BringToFront();

      // Set UseDpi to true to view the image at its original resolution
      _imageViewer.UseDpi = true;

      // Add Pan/Zoom interactive mode
      // Click and drag to pan, CTRL-Click and drag to zoom in and out
      _imageViewer.DefaultInteractiveMode = new ImageViewerPanZoomInteractiveMode();

      // Initialize the zoom system
      InitZoom(zoomComboBox, zoomInButton, zoomOutButton);

      // Load an image
      using (var codecs = new RasterCodecs())
         _imageViewer.Image = codecs.Load(Path.Combine(ImagesPath.Path, "Ocr1.tif"));

      base.OnLoad(e);
   }

   private void UpdateZoomValueFromView()
   {
      // Get the current scale factor from the viewer and set it in the zoom combo box
      var percentage = _imageViewer.ScaleFactor * 100.0;
      var zoomComboBox = this.Controls.Find("zoomComboBox", true)[0] as ComboBox;
      zoomComboBox.Text = percentage.ToString("F1") + "%";
   }

   private void InitZoom(ComboBox zoomComboBox, Button zoomInButton, Button zoomOutButton)
   {
      // Add support for user typing the zoom value in the combo box directly
      zoomComboBox.LostFocus += (sender, e) =>
      {
         // When the user moves away from the combo box, make sure it has a valid value
         UpdateZoomValueFromView();
      };

      zoomComboBox.KeyPress += (sender, e) =>
      {
         // Check if the finished editing by pressing Enter
         if (e.KeyChar == (char)Keys.Return)
         {
            // Yes, get the new value
            var value = zoomComboBox.Text.Trim();
            if (!string.IsNullOrEmpty(value))
            {
               // Remove the % sign if present
               if (value.EndsWith("%"))
                  value = value.Remove(value.Length - 1, 1).Trim();

               // Try to parse the new zoom value
               double percentage;
               if (double.TryParse(value, out percentage))
               {
                  // Valid value, zoom the viewer
                  _imageViewer.Zoom(ControlSizeMode.None, percentage / 100.0, _imageViewer.DefaultZoomOrigin);
               }

               // And update the combo box from this value (in case we set a value not in the min/max range)
               UpdateZoomValueFromView();
            }
         }
      };

      zoomComboBox.SelectedIndexChanged += (sender, e) =>
      {
         // Get the value from the combo box
         var value = zoomComboBox.Text.Trim();
         switch (value)
         {
            case "Actual Size":
               _imageViewer.Zoom(ControlSizeMode.ActualSize, 1, _imageViewer.DefaultZoomOrigin);
               break;

            case "Fit Page":
               _imageViewer.Zoom(ControlSizeMode.FitAlways, 1, _imageViewer.DefaultZoomOrigin);
               break;

            case "Fit Width":
               _imageViewer.Zoom(ControlSizeMode.FitWidth, 1, _imageViewer.DefaultZoomOrigin);
               break;

            case "Fit Height":
               _imageViewer.Zoom(ControlSizeMode.FitHeight, 1, _imageViewer.DefaultZoomOrigin);
               break;

            default:
               if (!string.IsNullOrEmpty(value))
               {
                  // A percentage, use it
                  var percentage = double.Parse(value.Substring(0, value.Length - 1));
                  _imageViewer.Zoom(ControlSizeMode.None, percentage / 100.0, _imageViewer.DefaultZoomOrigin);
               }
               break;
         }
      };

      // For zoom in button, use current ScaleFactor multiplied by the ratio
      zoomInButton.Click += (sender, e) =>
      {
         _imageViewer.Zoom(ControlSizeMode.None, _imageViewer.ScaleFactor * _zoomRatio, _imageViewer.DefaultZoomOrigin);
      };

      // For zoom out button, use current ScaleFactor divided by the ratio
      zoomOutButton.Click += (sender, e) =>
      {
         _imageViewer.Zoom(ControlSizeMode.None, _imageViewer.ScaleFactor / _zoomRatio, _imageViewer.DefaultZoomOrigin);
      };

      // Also update the value from the viewer when the transform changed, this happens if the user selects a fit mode,
      // such as fit width or fit page. The viewer will change the scale factor accordingly and we need to update it
      // in our combo box
      // This also takes care of Pan/Zoom interactive mode updating the scale fatcor
      _imageViewer.TransformChanged += (sender, e) =>
      {
         UpdateZoomValueFromView();
      };

      // Get the value from the viewer into the combo box
      UpdateZoomValueFromView();
   }
}
必要条件

ターゲットプラットホーム

参照

参照

ImageViewerクラス
ImageViewerメンバ