[初級] コンポーネントを利用して画像処理アプリケーションを作成する 後編
はじめに
前回は、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)。
「ツールボックスアイテムの選択」ダイアログ(図3)が表示されるので、「ImageGearComponents」フォルダのAxで始まる.dllファイル(表4)をすべて追加してください。
| AxGearCORELib.dll |
| AxGearDIALOGSLib.dll |
| AxGearDISPLAYLib.dll |
| AxGearFORMATSLib.dll |
| AxGearPROCESSINGLib.dll |
| AxGearVIEWLib.dll |
無事、ツールボックスにコンポーネントが追加できたでしょうか? 成功すると、図5のようにアイテムが追加されるはずです。また、参照設定でAxのつかない.dllファイル(表6)をすべて追加しておいてください。これで、コンポーネントに関する準備は完了です。

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

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

| ファイル(tsmiFile) |
| + 開く(tsmiOpen) |
| + 回転(tsmiRotate) |
| + 縮小・拡大(tsmiFit) |
| + 画面に合わせる(tsmiFitDevice) |
| + 幅に合わせる(tsmiFitWidth) |
| + 高さに合わせる(tsmiFitHeight) |
| + 実際のサイズ(tsmiFitActual) |
| + 終了(tsmiClose) |
プログラムコードを追加しよう
コンポーネントの貼り付けが終わって、これであと半分の道のりです。続いてプログラムコードの記述に移ります。まず、プログラムコードの入力の手間を減らすため、名前空間を宣言しておきましょう(リスト1)。これで、わざわざ長い名前を入力する必要がなくなります。
Imports GearCORELib Imports GearDIALOGSLib Imports GearDISPLAYLib Imports GearFORMATSLib Imports GearPROCESSINGLib Imports GearVIEWLib
そして、フォーム全体で利用する変数の宣言です(リスト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)。
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枚だけです。ファイルフォーマットによっては、複数のページを持つものもあります。ページから、表示用のページディスプレイオブジェクトを生成します。生成したページディスプレイオブジェクトをビューアに設定し、ビューアを更新して、画像を表示します。
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°ずつ、一回転させることも可能です。
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プロパティにそれぞれの値を設定します。最後に、表示を更新して、この処理は完了します。
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()メソッドによって、初期状態となったズーム情報を設定します。
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 V15
- 製品ページ: ImageGear for .NET V16
-> ImageGearを利用したアプリケーション開発(前編)」





















