[初級] コンポーネントを利用して画像処理アプリケーションを作成する 後編

はじめに

前回は、ImageGearのインストールと環境の準備、製品概要について紹介しました。  今回は、具体的に簡単なサンプルプログラムを作ることで、その使い勝手に迫ってみたいと思います。プログラムが書きたくてたまらない皆さんには、お待たせしてしまってごめんなさい。それでは、さっそく始めましょう。

CodeZine
ImageGearを利用して高度な画像処理を手軽に実装する(実装編)
[初級] コンポーネントを利用して画像処理アプリケーションを作成する 後編
こだかかおる [著]
完成画像
完成画像

対象読者

  • Visual Basic 2005を使ってプログラムを作ったことがある人。
  • 画像を扱うアプリケーションを作成したい人。

必要な環境

 最小要件として、Pentiumクラスのプロセッサ、64MB RAMとなっていますが、当然、オペレーティングシステムや開発環境/実行環境が、想定している最小要件を満たす必要があります。オペレーティングシステムとしては、32ビットオペレーティングシステム(Windows 98SE/Me、Windows 2000/XP、Windows Server 2003、Windows Vista)に対応しており、開発環境としては、Visual Basic 6.0、Visual C/C++ 6.0、Visual Studio .NET 2003、Visual Studio 2005に対応しています。

 ImageGear for .NETという.NET Framework用の製品も用意されていますが、今回はImageGear v15に含まれているActiveX版を使ってみることにします。ImageGearのインストールがまだの方は、インストールと試用ライセンスの登録を先に済ませておいてください(前回の記事を参照)。

ImageGearを使うための準備

 さっそくプロジェクトを作成して、アプリケーションを作っていきましょう。プロジェクト名は「ImageViewer」としました。画像ファイルを表示して、ちょっとした処理を行うという簡単なアプリケーションです。

 Visual Basic 2005でActiveXコントロールを利用するときは、ツールボックスにActiveXコントロール(*.ocxファイル)を追加して、それからフォームに貼り付ける、というのが通常のやり方です。今回も同様に行う予定だったのですが、少々エラーが出てしまいましたので、別の方法を使うことにします。

 記事のサンプルプログラムのzipファイルの中に、「ImageGearComponents」というフォルダがあります。ここに、既に.NET用に作成したラッパーファイルを入れておきました。このファイル群を利用してください。ツールボックスにImageGearコンポーネント用のタブを作成し(図1)、アイテムを追加します(図2)。

図1 - タブの追加
図1 - タブの追加
図2 - アイテムの選択
図2 - アイテムの選択

 「ツールボックスアイテムの選択」ダイアログ(図3)が表示されるので、「ImageGearComponents」フォルダのAxで始まる.dllファイル(表4)をすべて追加してください。

図3 - 「ツールボックスアイテムの選択」ダイアログ
図3 - 「ツールボックスアイテムの選択」ダイアログ
表4 - 「ツールボックスアイテムの選択」ダイアログで追加する.dllファイル
AxGearCORELib.dll
AxGearDIALOGSLib.dll
AxGearDISPLAYLib.dll
AxGearFORMATSLib.dll
AxGearPROCESSINGLib.dll
AxGearVIEWLib.dll

 無事、ツールボックスにコンポーネントが追加できたでしょうか? 成功すると、図5のようにアイテムが追加されるはずです。また、参照設定でAxのつかない.dllファイル(表6)をすべて追加しておいてください。これで、コンポーネントに関する準備は完了です。

図5 - ツールボックス(アイテム追加後)
図5 - ツールボックス(アイテム追加後)
表6 - 参照設定で追加するファイル
GearCORELib.dll
GearDIALOGSLib.dll
GearDISPLAYLib.dll
GearFORMATSLib.dll
GearPROCESSINGLib.dll
GearVIEWLib.dll

フォームの作成

 コンポーネントの準備も無事終わったので、フォームにコンポーネントを貼り付けていきます。全部で6つです(表7)。このうち、AxIGPageViewCtlコンポーネント以外はアイコンで表示され、アプリケーションの実行時には表示されません(図8)。AxIGPageViewCtl1のDockプロパティをFillに変更し、画面サイズの変更に合わせてコンポーネントのサイズが変更されるようにしておきましょう。

表7 - フォームに貼り付けるコンポーネント
AxIGCoreCtl (AxIGCoreCtl1)
AxIGDlgsCtl (AxIGDlgsCtl1)
AxIGDisplayCtl (AxIGDisplayCtl1)
AxIGFormatsCtl (AxIGFormatsCtl1)
AxIGProcessingCtl (AxIGProcessingCtl1)
AxIGPageViewCtl (AxIGPageViewCtl1)
図8 - コンポーネントをフォームに貼り付け
図8 - コンポーネントをフォームに貼り付け

 それから、メニュー(MenuStrip1)を追加します(図9)。アプリケーションの操作は、このメニューから行うことにしましょう。メニューのキャプションを日本語にするとメニューアイテム名も日本語になってしまうので、表10のカッコ内を参考にして、Nameプロパティを変更しておいてください。

図9 - メニューの設定
図9 - メニューの設定
表10 - メニューアイテム
ファイル(tsmiFile)
   + 開く(tsmiOpen)
   + 回転(tsmiRotate)
   + 縮小・拡大(tsmiFit)
      + 画面に合わせる(tsmiFitDevice)
      + 幅に合わせる(tsmiFitWidth)
      + 高さに合わせる(tsmiFitHeight)
      + 実際のサイズ(tsmiFitActual)
   + 終了(tsmiClose)

プログラムコードを追加しよう

 コンポーネントの貼り付けが終わって、これであと半分の道のりです。続いてプログラムコードの記述に移ります。まず、プログラムコードの入力の手間を減らすため、名前空間を宣言しておきましょう(リスト1)。これで、わざわざ長い名前を入力する必要がなくなります。

リスト1 - 名前空間の宣言
Imports GearCORELib
Imports GearDIALOGSLib
Imports GearDISPLAYLib
Imports GearFORMATSLib
Imports GearPROCESSINGLib
Imports GearVIEWLib

 そして、フォーム全体で利用する変数の宣言です(リスト2)。

リスト2 - フォーム全体で利用する変数の宣言
Private m_IGFileDlg As IGFileDlg
Private m_DlgLoadOptions As IIGFileDlgDocumentLoadOptions

Private m_IGPage As IGPage
Private m_IGDocument As IGDocument
Private m_IGPageDisplay As IGPageDisplay

 フォームがロードされたら、いろいろな初期化処理を行います(リスト3)。

リスト3 - フォームのロードイベント
Private Sub Form1_Load( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs _
  ) Handles MyBase.Load

    AxIGCoreCtl1.License.SetSolutionName( _
      "AccuSoft 1-100-15")

    AxIGCoreCtl1.AssociateComponent( _
      AxIGFormatsCtl1.ComponentInterface)
    AxIGCoreCtl1.AssociateComponent( _
      AxIGFormatsCtl1.ComponentInterface)
    AxIGCoreCtl1.AssociateComponent( _
      AxIGDisplayCtl1.ComponentInterface)
    AxIGCoreCtl1.AssociateComponent( _
      AxIGProcessingCtl1.ComponentInterface)

    AxIGDlgsCtl1.GearCore = _
      AxIGCoreCtl1.ComponentInterface
    AxIGDlgsCtl1.GearFormats = _
      AxIGFormatsCtl1.ComponentInterface
    AxIGDlgsCtl1.GearDisplay = _
      AxIGDisplayCtl1.ComponentInterface

    m_IGFileDlg = AxIGDlgsCtl1.CreateFileDlg()
    m_IGPage = AxIGCoreCtl1.CreatePage()

  End Sub

 ここで行っている処理を、順に見ていきましょう。

 ImageGearのコンポーネントを使ったアプリケーションでは、必ずソリューション名を指定しなくてはいけません。上記のとおり、「AccuSoft 1-100-15」と指定します。ImageGearをコールするアプリケーションを配布するためには固有のソリューション名その他のランタイムデータが必要です。このランタイムデータは、開発キットを購入し開発用ライセンスを取得するときにプロトンから通知されます。

 それから、コアコンポーネントと、それ以外の各コンポーネントの関連付けです。このアプリケーションでは、ダイアログを表示してファイルを選択しますが、そのダイアログの準備もしておきましょう。コアコンポーネントとの関連付け、さらに、フォーマット、ディスプレイの各コントロールと関連付けを行います。それらの処理が終わったら、CreateFileDlg()メソッドで新しい「ファイルを開く」ダイアログのインスタンスを生成します。最後に、ファイルを表示するためのページを作成しておきます。このページに、選択した画像が表示されることになります。

 メニューの処理も記述していきます。[ファイル]-[開く]メニューでは、まず、ダイアログオプションを指定します。今回は「ドキュメントを開く」処理なので、IG_FILEDLGOPTIONS_DOCLOADOBJを指定することになります。さらに、オプションを指定して、実際にダイアログを表示します。ここで、ファイルが選ばれたときは、Trueが返ることになります。その場合には、処理を続行します。

 ドキュメントを作成し、選択されたファイルをドキュメントに読み込みます。ドキュメントは複数のページを持っていますが、通常のJPEGファイルなどでは、ページは1枚だけです。ファイルフォーマットによっては、複数のページを持つものもあります。ページから、表示用のページディスプレイオブジェクトを生成します。生成したページディスプレイオブジェクトをビューアに設定し、ビューアを更新して、画像を表示します。

リスト4 - ファイルを開く処理
Private Sub tsmiOpen_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs _
  ) Handles tsmiOpen.Click

    m_DlgLoadOptions = _
      AxIGDlgsCtl1.CreateFileDlgOptions( _
        enumIGFileDlgOptionsType.IG_FILEDLGOPTIONS_DOCLOADOBJ)

    If m_IGFileDlg.Show(m_DlgLoadOptions) Then

      m_IGDocument = _
        AxIGCoreCtl1.CreateDocument(0)
      With m_DlgLoadOptions
        AxIGFormatsCtl1.LoadDocumentFromFile( _
          m_IGDocument, _
          .FileName, _
          .StartPage, _
          .Position, _
          -1)
      End With

      m_IGPage = m_IGDocument.Page(0)
      m_IGPageDisplay = _
        AxIGDisplayCtl1.CreatePageDisplay(m_IGPage)

      AxIGPageViewCtl1.PageDisplay = m_IGPageDisplay

    End If

    AxIGPageViewCtl1.UpdateView()

End Sub

 これでビューアとしての基本機能は完成です。いくつか機能を付け加えていくことにしましょう。

 リスト5では、表示した画像を回転する処理を行っています。処理の内容ですが、Rotate90k()メソッドによって、ページを90°ずつ回転します。これを複数回処理することによって、90°ずつ、一回転させることも可能です。

リスト5 - 表示した画像を回転させる処理
Private Sub tsmiRotate_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs _
  ) Handles tsmiRotate.Click

    AxIGProcessingCtl1.Rotate90k( _
      m_IGPage, _
      enumIGRotationValues.IG_ROTATE_90)

    AxIGPageViewCtl1.UpdateView()

End Sub

 さらに、画像を縮小したり、拡大したりする機能も付け加えてみましょう。現在のサイズ/幅/高さに合わせた縮小・拡大処理を行います。また、実際の画像の大きさに戻す処理も行います。それぞれの処理で違うところは、Layout.FitModeに設定している値だけです。いったん、自前で用意したResetZoom()メソッドを呼び出して、縮小・拡大を初期化してから、Layout.FitModeプロパティにそれぞれの値を設定します。最後に、表示を更新して、この処理は完了します。

リスト6 - 縮小・拡大処理
Private Sub tsmiFitDevice_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs _
  ) Handles tsmiFitDevice.Click

    ResetZoom()
    m_IGPageDisplay.Layout.FitMode = _
      enumIGDsplFitModes.IG_DSPL_FIT_TO_DEVICE

    AxIGPageViewCtl1.UpdateView()

End Sub

Private Sub tsmiWidth_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs _
  ) Handles tsmiWidth.Click

    ResetZoom()
    m_IGPageDisplay.Layout.FitMode = _
      enumIGDsplFitModes.IG_DSPL_FIT_TO_WIDTH

    AxIGPageViewCtl1.UpdateView()

End Sub

Private Sub tsmiHeight_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs _
  ) Handles tsmiHeight.Click

    ResetZoom()
    m_IGPageDisplay.Layout.FitMode = _
      enumIGDsplFitModes.IG_DSPL_FIT_TO_HEIGHT

    AxIGPageViewCtl1.UpdateView()

End Sub

Private Sub tsmiFitActual_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs _
  ) Handles tsmiFitActual.Click

    ResetZoom()
    m_IGPageDisplay.Layout.FitMode = _
      enumIGDsplFitModes.IG_DSPL_ACTUAL_SIZE

    AxIGPageViewCtl1.UpdateView()

End Sub

 縮小・拡大処理で、それぞれ呼び出す処理を自前の関数にしておきました。ResetZoom()関数です。ここで行っている処理は、現在の縮小・拡大情報(ズーム情報)を取得し、Modeプロパティの値を、幅、高さ共に初期状態に設定するというものです。UpdateZoomFrom()メソッドによって、初期状態となったズーム情報を設定します。

リスト7 - 縮小・拡大されている画像をもとに戻す処理
Private Sub ResetZoom()
    Dim zoom As IGDisplayZoomInfo

    zoom = _
      m_IGPageDisplay.GetZoomInfo(AxIGPageViewCtl1.hWnd)

    zoom.Mode = _
      enumIGDsplZoomModes.IG_DSPL_ZOOM_H_NOT_FIXED Or _
      enumIGDsplZoomModes.IG_DSPL_ZOOM_V_NOT_FIXED

    m_IGPageDisplay.UpdateZoomFrom(zoom)

End Sub

おわりに

 今回は、ImageGear v15のコンポーネントを利用して、かんたんなイメージファイルビューアを作成してみました。メソッドをいくつか呼び出すだけで、お手軽に実現できることが理解していただけたと思います。もちろん、ImageGearのコンポーネントが持つ機能は、これだけではありません。その素晴らしさを体験するためにも、ぜひ一度試してみてください。その優れた機能を実感してもらえると思います。

 製品紹介セミナーを実施中です。


-> ImageGearを利用したアプリケーション開発(前編)