CodeZine(コードジン)

特集ページ一覧

複数のTiff画像を1つのファイルに収める.NETアプリケーションの作成

LEADTOOLS 16.5J Document ImagingのRasterImageViewerを使ったアプリケーションの作成

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2012/02/27 16:00

 LEADTOOLS 16.5J Documentシリーズは、複数の画像データを1つのファイルに保持できる「マルチページファイル機能」をサポートする画像処理コンポーネントです。今回は、このLEADTOOLS 16.5J Document ImagingのRasterImageViewerを使い、TIFF形式の画像ファイルからマルチページTIFFファイルを作成するアプリケーションを作成してみました。

はじめに

 デジカメやスマートフォンの普及により、気軽に写真を撮れる時代になりましたが、その反面、画像ファイルの管理に苦労しています。特に過去の画像データから必要な写真を探し出す時など、毎回フォルダ内のファイルをクリックしては画像を確認する作業が無駄な時間だといつも感じています。いっそ、アルバム機能を持ったアプリケーションを作ろうか、と思い便利なコンポーネントを探していたところ、LEADTOOLS 16.5J Documentシリーズを見つけました。

 このコンポーネントは、TIFF(タグ付き画像ファイル形式)フォーマットの機能の1つである、複数の画像データを1つのファイルに保持できるマルチページファイル機能をサポートし、マルチページファイルの読み書きを行う機能を持っています。

 そこで、今回はLEADTOOLS 16.5J Document ImagingのRasterImageViewerコンポーネントを使い、TIFF形式の画像ファイルからマルチページTIFFファイルを作成するアプリケーションを作成してみました。

メニューから画像ファイルを選んで追加する
メニューから画像ファイルを選んで追加する
ダイアログで画像を追加。追加した画像はすぐにビューワーに表示する
ダイアログで画像を追加。追加した画像はすぐにビューワーに表示する
コントロールボタンでページの移動ができる
コントロールボタンでページの移動ができる

対象読者

 Visual Basic、Visual C# 2005/2008/2010を使ってプログラムを作ったことのある人

必要な環境

 Visual Basic、Visual C#、Visual Studioの2005/2008/2010でプログラムが作れる環境。なお、本プログラムはWindows Vista上で動作するVisual Studio 2008を使用して作成し、動作確認を行っています。

※サンプルソース実行時の注意事項

 LEADTOOLS 16.5Jを使って作成したアプリケーションを配布する場合、アセンブリファイルを添付する必要があります。アプリケーションを正常に動作させるためには、次のファイルを実行プログラムと同じフォルダにインストールしてください。

  • Leadtools.dll
  • Leadtools.Codecs.dll
  • Leadtools.Codecs.Fax.dll
  • Leadtools.Codecs.Tif.dll
  • Leadtools.WinForms.dll

 LEADTOOLS 16.5JをVisual Studio 2010(.NET Framework 4)で使用する場合には、プロジェクト内に生成される「App.config」ファイルの<startup>要素にuseLegacyV2RuntimeActivationPolicy属性を追加して「True」に設定する必要があります。

 この設定を行わない場合、ビルド時にエラーが発生します。以下のように、「App.config」ファイル内の<startup>要素に「useLegacyV2RuntimeActivationPolicy」属性を追加してください。

<startup useLegacyV2RuntimeActivationPolicy="true">

 また、作成するプロジェクトによっては、この「App.config」ファイルが生成されない場合があります。その場合は、Visual Studio 2010から追加するか、テキストファイルで「App.config」ファイルを作成してプロジェクトに追加してください。

 Visual Studio 2010 から追加する場合は、手順は以下となります。

  1. [プロジェクト]-[新しい項目の追加]を選択する
  2. 「アプリケーション構成ファイル」を選択する
  3. [追加]ボタンを押す

 テキストファイルで追加する場合は、作成するファイル名は必ず「App.config」にし、以下の内容を記述します。

App.config コードの内容
<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
       <supportedRuntime version="v4.0"/>
    </startup>
</configuration>
【コラム】プログラム実行エラーへの対処法

 「App.config」ファイルを修正・追加しても、プログラム実行時に次のような実行エラーが出る場合があります。

表示される実行エラー
表示される実行エラー

 この場合は、次の手順でプロジェクトのプロパティの「対象フレームワーク」を「.NET Framework 4 Client Profile」から「.NET Framework 4」に変更します。

  1. 「プロジェクト」メニューの「xxxのプロパティ」を選ぶ
  2. 「コンパイル」タブをクリックし、「詳細コンパイルオプション...」ボタンをクリックする
  3. 「対象のフレームワーク」が「.NET Framework 4 Client Profile」になっているのを、「.NET Framework 4」に変える
  4. プロジェクトのプロパティを閉じ、プロジェクトを実行する。
  5. 再び同じ手順で「詳細コンパイルオプション」の「対象のフレームワーク」を「.NET Framework 4 Client Profile」に戻す
「詳細コンパイルオプション」の「対象のフレームワーク」を「.NET Framework 4 Client Profile」から「.NET Framework 4」に変える
「詳細コンパイルオプション」の「対象のフレームワーク」を「.NET Framework 4 Client Profile」から「.NET Framework 4」に変える

コンポーネントのインストール

 この記事の手順を試すには、Visual Studio、Visual Basic、Visual C#の開発環境にLEADTOOLS 16.5Jをインストールする必要があります。インストーラは、グレープシティのWebページからダウンロードできます。

 製品ページのトライアル版申込フォーム下部にある[同意する]ボタンをクリックして、グレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきますので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

コントロールおよび参照の追加

 LEADTOOLS 16.5Jをインストールしたら、プロジェクトにコントロールを追加します。ツールボックスに専用のタブを作成し、使用するコンポーネントを追加します。追加するコンポーネントは、アセンブリ名が「Leadtools.WinForms(16.5.0.0)」の「RasterImageViewer」コントロールです。

アセンブリ名が「Leadtools.WinForms(16.5.0.0)」の「RasterImageViewer」コントロールを選択する
アセンブリ名が「C1.C1Pdf.4」の「C1PdfDocument」コントロールを選択する

 また、プロジェクトに以下のランタイムライブラリへの参照を追加します。LEADTOOLS 16.5Jでは、アプリケーションで使用する画像に対応したフィルタファイルへの参照も必要になります。

ランタイムライブラリ
ファイル 内容
Leadtools.dll LEADTOOLS本体
Leadtools.Codecs.dll LEADTOOLSでサポートされている画像形式の画像データ読み込み/保存を行うクラス
Leadtools.Codecs.Fax.dll LEADTOOLSでサポートされている画像形式の画像データ読み込み/保存を行うクラス
Leadtools.Codecs.Tif.dll LEADTOOLSでサポートされている画像形式の画像データ読み込み/保存を行うクラス
Leadtools.WinForms.dll LEADTOOLSを使用してWindowsフォームアプリケーションを作成するためのクラス
「.NET」の5つのDLLへの参照を設定する
「.NET」の5つのDLLへの参照を設定する

LEADTOOLS 16.5JとRasterImageViewerコントロールについて

 LEADTOOLS 16.5Jは、画像処理コンポーネントをセットにしたオールインワンのコンポーネントパッケージです(32/64ビットOSに対応)。WindowsフォームおよびASP.NETの.NETコンポーネントとネイティブ関数(C++)、WPFに対応したコンポーネントが含まれており、幅広いファイル形式のサポート(変換/圧縮)、画像表示、画像処理、スキャニング、アノテーションなど、包括的で柔軟性のある強力な画像処理ソリューションを提供します。

 また、Document OCRでは、Document Imagingの全機能に加えて、OCR(光学式文字認識)機能を提供します。さらに、Document OCR with Plug-Insは、Document OCRの機能にフォーム認識、マーク認識(OMR)、バーコード認識、認識結果のPDF出力といった機能を加え、あらゆるタイプのフォーム認識を実現できます。

LEADTOOLS 16.5Jの主な機能

 LEADTOOLSは、画像表示、画像圧縮、ファイル形式のサポート(インポート、エクスポート、変換)、画像処理、画像変換、Fast TWAINスキャン、画面キャプチャ、表示エフェクトとトランジションエフェクト、カラー変換、印刷、データベース/インターネットでの画像のサポートなど多彩なイメージング機能を提供します。

  • ファイル形式のサポート

     JPEG、GIF、TIFF(G3/G4、LZW、CMYK、JTIFを含む)、PNG、BMP、MODCA/IOCA、PCX、TGAなど、現在あるほとんどの画像形式のファイルの読み取り、書き込み、および変換処理を行うことができます。

  • 画像処理

     画像(または画像の選択した部分)を処理する200以上のデジタルフィルタと変換関数が用意されています。スムージング、シャープ化、エッジの抽出/強調、明度/コントラスト/ガンマの変更、色相と彩度の変更、赤目の除去、アンシャープマスク、ノイズの追加、各種リサンプリング手法(バイキュービックなど)を使用したリサイズと回転などの処理をアプリケーションに組み込むことができます。

  • カラー変換

     24ビットのTrueカラー、8ビットのインデックスカラー、1ビットの白黒などの間でカラーモードを変換できます。カラーモードを変更するとピクセルあたりのデータ量が変更され、画像に必要なメモリ/ディスクの量が変わります。

  • 圧縮

     JPEG、CMP、LZW、G3/G4、ハフマン、ランレングスなどの最適かつ最速の圧縮アルゴリズムを使用して画像を圧縮します。LEADTOOLSは、標準的なラスタファイル形式で見られる圧縮方式に加えて、業界標準を上回る高性能の独自圧縮技術も幅広くサポートしています。

  • 高速な画像表示/エフェクト

     品質、位置/倍率、リサンプル手法(通常/バイリニア/バイキュービック)、明度/コントラスト/ガンマ、減色/ディザリング、画像(ソース)とデバイス(デスティネーション)のクリッピング、リサイズ、回転などを制御しながら、画像または選択したリージョンを表示デバイスにレンダリングします。また、小さいパンウィンドウを使用した大きい画像内の移動、サムネイルビューアを使用した画像のグループの閲覧、2000を超える描画トランジションおよびエフェクトの表示画像への適用も可能です。

  • Fast TWAINスキャン

     TWAINをサポートする任意のデバイスからの画像の取り込みを制御します。デバイスの組み込みユーザーインタフェースを使用するほかに、独自のユーザーインタフェースを作成することもできます。

  • 印刷

     位置/倍率やハーフトーン処理/ディザリングを制御しながら、画像または選択したリージョンを印刷します。複数の画像とテキストを単一または複数のページに印刷できます。

  • 画像最適化

     画像を減色して圧縮を最大化することにより、Webサイトやアプリケーション向けに画像を最適化します。

  • データバインディング

     サポートされている任意のファイル形式または圧縮技術を用いた画像を、SQLなどのデータベース、ODBCまたはOLE DBをサポートするデータベース、または.NETデータコントロール接続を通じてバインディング可能なデータベースに保存します。

  • コモンダイアログ

     画像処理コモンダイアログで提供されている一連のコモンダイアログボックスは、Windowsコモンダイアログの機能をLEADTOOSの画像処理機能と統合します。

  • Mixed Raster Content

     LEADTOOLS Mixed Raster Content(MRC)により、Mixed Raster Content形式(T44規格の一部としてカラーおよびグレースケールFAXのために定義された形式)が提供されています。

  • スクリーンキャプチャ

     スクリーンキャプチャ機能を使用して、画面やアプリケーションのリソースから画像をキャプチャし、LEADTOOLSでサポートされている数多くの画像ファイル形式で保存できます。

  • Plug-In

     LEADTOOLS 16.5Jで読み込んだ画像データ上のバーコードの読み込みや、画像データへのバーコードの書き込みを可能にするBarcode Plug-Inや、PDFファイル読み込み、保存、表示機能を追加するPDF Plug-Inも提供されています。

 今回は、この多彩な機能の中からマルチTIFFファイル機能を使って、複数のTIFFフォーマットの画像を1つのファイルにまとめる機能を持ったアプリケーションを作成します。

※注2

 記事のスペースの関係でLEADTOOLS 16.5Jのすべての機能は紹介できないため、詳しい内容を知りたい方は、以下の製品ホームページをご覧ください。

TIFFマルチファイル機能について

 TIFFは、デジタル画像データの互換性の一般化を促進するために設計された、タグベースのファイル形式です。TIFFファイルでは画像データを保存する方法が1つではないため、さまざまな形式のTIFFが存在しますが、LEADTOOLSは一般的なTIFF形式のほとんどをサポートしています。

 その形式の1つに、マルチファイル機能があります。この形式は、ひとつのファイルの中に複数の画像を格納し、マルチページファイルとして保存できる機能で、タグ情報は各ページごとに独立して管理されページごとに画像のサイズ、圧縮方法、カラー形式などを決めることができるようになっています。また、保存する画像の形式も青/緑/赤の順のカラー画像、赤/緑/青の順のカラー画像、12ビットまたは16ビットのグレースケール画像を選べるようになっています。

 なお、マルチページファイルに格納できるページ数の制限については、TIFFの理論的な上限サイズは4GBと言われています。しかし、あまりにも数が多いとファイルの読み込みに時間がかかってしまうため、LEADTOOLS 16.5Jでは、RasterCodecsクラスを使用してTIFFファイルをラスタ画像ファイルとして読み込み/書き込みを行います。

RasterImageViewerコントロールについて

 RasterImageViewerは、ビットマップ、メタファイル、アイコン、JPEG、GIF、PNGその他のLEADTOOLSでサポートされている画像ファイル形式のグラフィックを表示するために使用します。表示するRasterImageオブジェクトをImageプロパティに設定して、画像ファイルを表示します。RasterImageクラスは、ピクセルデータによって定義された画像を操作するために使用し、メモリ内の画像を扱うためのメソッドとプロパティがあります。

 このクラスを使用すると、画像を一から作成したり、ディスク上のファイルから画像をロードしたりできます。また、RasterImageクラスは、1、2、3、4、5、6、7、8、12、16、24、32、48、および64ビットの画像のメモリへの格納をサポートします。8ビットと12ビットのグレースケール画像もサポートされています。

 また、RasterImageオブジェクトのデータは、圧縮なし、RLE圧縮、または超圧縮された状態でメモリに格納できます(超圧縮ビットマップが使用できるのはDocumentシリーズのみです)。

 そして、RasterImageオブジェクトはサイズの異なる複数のページを保持できます。既存のRasterImageに新しいページを追加するには、AddPage、AddPages、InsertPage、InsertPagesの各メソッドを使用します。

 RasterImageオブジェクトから既存のページを削除するには、RemovePageAt、RemovePages、RemoveAllPagesの各メソッドを使用します。PageCountプロパティはRasterImageオブジェクトの総ページ数を保持します。現在のアクティブページを変更するには、Pageプロパティを使用します。RasterImageViewerコントロールは、このRasterImageオブジェクトを使用して、マルチファイルTIFFの各ページを表示させます。

フォームの作成

 では、さっそくプログラムを作成しましょう。作成するプログラムは、「ファイルを保存ダイアログ」で新しいマルチファイルを作成し、メニューから挿入するTIFFファイルを選んで保存します。ファイルを保存した後、その画像ファイルをRasterImageViewerコントロールで表示します。

 また、Buttonコントロールを使用して、保存したファイルを1ページずつ表示したり、ページの先頭と最後に移動する機能も組み込みます。

GUIのデザイン

 フォームには、これらの機能を実装するために、RasterImageViewer、MenuStrip、SaveFileDialog、OpenFileDialog、ToolTip、Button、の各コントロールを配置します。メニューは、以下の階層のメニューを作成します。

  • ファイル
    • 新規作成
    • 終了
  • TIFF編集
    • TIFFファイルの追加
フォームのレイアウト
フォームのレイアウト

マルチページTIFFファイルの新規作成処理

 ユーザーインターフェイスができたら、コードを実装していきます。最初は、「新規作成」メニューのClickイベントハンドラで行う新しいマルチページTIFFファイの作成です。処理の流れとしては、「ファイルの保存」ダイアログボックスを表示し、作成するマルチページTIFFファイルのファイル名を決めてもらいます。

 次にフォームのLoadイベントハンドラで、RasterCodecsクラスのStartupメソッドを実行し、画像の入出力ライブラリの起動に必要なデータを初期化します。このStartupメソッドはアプリケーションの開始時に1回だけ実行します。

 そして、「ファイルを保存ダイアログ」を表示します。SaveFileDialogコントロールは、フィルタにTiffを指定し、デフォルトで「multi_tiff1.tif」というファイル名を設定しておきます。入力されたファイル名は、グローバル変数として宣言した「MultiTiff_Fname」に格納しておきます。なお、3つの名前空間を宣言しておいてください。

Visual Basic
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.WinForms

Public Class Form1
    Private MultiTiff_Fname As String = ""

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ' 入出力ライブラリの起動に必要なデータを初期化します。
        RasterCodecs.Startup()
    End Sub

    Private Sub 新規作成ToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles 新規作成ToolStripMenuItem.Click

        SaveFileDialog1.Filter = "Tiffファイル(*.tif)| *.tif"
        SaveFileDialog1.FileName = "multi_tiff1.tif"
        If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            If MessageBox.Show("次のファイル名でマルチTIFFファイルを作成します。" + Environment.NewLine + SaveFileDialog1.FileName, "ファイル作成の確認", _
                               MessageBoxButtons.OKCancel, _
                               MessageBoxIcon.Question) = Windows.Forms.DialogResult.OK Then
                MultiTiff_Fname = SaveFileDialog1.FileName
            Else
                MessageBox.Show("ファイルの作成を中止しました")
            End If
        End If
    End Sub
C#
using Leadtools;
using Leadtools.Codecs;
using Leadtools.WinForms;

namespace Multi_Tiff_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private String MultiTiff_Fname = "";
        private void Form1_Load(object sender, EventArgs e)
        {
            // 入出力ライブラリの起動に必要なデータを初期化します。
            RasterCodecs.Startup();
        }

        private void 新規作成ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.saveFileDialog1.Filter =  "Tiffファイル(*.tif)| *.tif";
            this.saveFileDialog1.FileName = "multi_tiff1.tif";
            if(this.saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                if(MessageBox.Show("次のファイル名でマルチTIFFファイルを作成します。" + 
                                    Environment.NewLine + saveFileDialog1.FileName, 
                                    "ファイル作成の確認", MessageBoxButtons.OKCancel, 
                                    MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.OK)
                {
                    MultiTiff_Fname = saveFileDialog1.FileName;
                }else
                {
                    MessageBox.Show("ファイルの作成を中止しました");
                }
            }
            
        }

マルチページTIFFファイルへのTIFF画像ファイルの追加処理

 次に、「TIFFファイルの追加」メニューのClickイベントハンドラに、マルチページTIFFファイルへのTIFF画像ファイルの追加処理を作成します。実際のマルチページTIFFファイルの保存は、このイベントハンドラで行われます。処理は次のようになります。

 (1)最初に、マルチページTIFFファイル名が決められているかどうかをチェックし、このファイル名がなければこのイベントハンドラの処理を中止します。

 (2)マルチページTIFFファイル名が決められていれば、TIFF画像ファイルの追加処理を行います。まず、RasterCodecsオブジェクトを初期化します。RasterCodecsクラスは、ラスタ画像ファイルをロードおよび保存するための機能を提供するクラスで、このあといくつかのメソッドを使用するので、ここでこのクラスのインスタンスを作成しておきます。

 (3)OpenFileDialogコントロールのShowメソッドを実行し、追加するTiffファイルを選択してもらいます。ファイル名を取得したら、RasterCodecsクラスのLoadメソッドを実行し、この画像ファイルをロードします。メソッドの引数はTiff画像のファイル名で、読み込んだ画像をRasterImageオブジェクトとして返してきますので、これを変数「page」に格納しておきます。

 (4)追加する画像ファイルが初めてマルチページTIFFファイルに追加される場合は、同じRasterImage型の変数「image」に代入します。追加する画像ファイルが2枚目以降であれば、変数「image」にAddPageメソッドを使って追加します。

 RasterImageクラスは、ピクセルデータによって定義された画像の操作および変換のための作業領域として働き、メモリ内の画像にアクセスしたり、画像の特性を維持したりします。RasterImageクラスは「ISerializable」インタフェースを実装しているため、標準の.NETシリアル化をサポートしており、複数の画像データをページ単位で保持できます。ですので、初めて画像を組み込む場合は単純な代入式で、新しい画像をページとして追加する場合はAddPageメソッドを使用します。

 (5)RasterImageクラスに画像を追加したら、RasterCodecsクラスのSaveメソッドを実行します。このメソッドは、サポートされている任意の圧縮ファイル形式または非圧縮ファイル形式で、RasterImageのページをリモートURLに保存します。メソッドは、次の引数形式のものを使用します。

Saveメソッドの書式
Save(RasterImage,String,RasterImageFormat,Int32,Int32,Int32,Int32,CodecsSavePageMode)
Visual Basic
Public Overloads Sub Save( _
   ByVal image As RasterImage, _
   ByVal fileName As String, _
   ByVal format As RasterImageFormat, _
   ByVal bitsPerPixel As Integer, _
   ByVal firstPage As Integer, _
   ByVal lastPage As Integer, _
   ByVal firstSavePageNumber As Integer, _
   ByVal pageMode As CodecsSavePageMode _
) 
C#
public void Save( 
   RasterImage image,
   string fileName,
   RasterImageFormat format,
   int bitsPerPixel,
   int firstPage,
   int lastPage,
   int firstSavePageNumber,
   CodecsSavePageMode pageMode
)
  • パラメータの内容
    • image

       画像データを含むRasterImageオブジェクト

    • fileName

       出力ファイル名を表すString

    • format

       出力ファイル形式。RasterImageFormat列挙体のメンバを指定。Tiffファイルの場合は「RasterImageFormat.Tif」を指定

    • bitsPerPixel

       出力ファイルのビット数。bitsPerPixelが0の場合は、そのファイル形式でサポートされている最も近いビット数を使用してファイルが保存される

    • firstPage

       imageを保存する最初のページ番号を1から始まるインデックスで指定

    • lastPage

       imageを保存する最後のページ番号を1から始まるインデックスで指定。imageのfirstPageから最後のページまでを保存する場合は-1を指定

    • firstSavePageNumber

       画像ページのどのページを上書きするか、またはどの位置に新しいページを追加するかを1から始まるインデックスで指定

    • pageMode

       マルチページ形式で保存する場合のページの取り扱い方法を以下のいずれかで指定

    説明
    CodecsSavePageMode.Append ファイルの最後に新しいページを追加。ファイルが存在しない場合は、ファイルを作成してページが追加される。firstSavePageNumberは使用されない
    CodecsSavePageMode.Insert firstSavePageNumberで指定したインデックスに新しいページを挿入
    CodecsSavePageMode.Replace firstSavePageNumberで指定したインデックス以降のページを置き換え
    CodecsSavePageMode.Overwrite firstSavePageNumberで指定したインデックス以降のページを上書き
    CodecsSavePageMode.Append ファイルの最後に新しいページを追加。ファイルが存在しない場合は、ファイルを作成してページが追加される

     ここでは、Tiffフォーマットで、画像を追加するたびにすべてのページを上書き保存するようにします。保存したら、RasterImageオブジェクトを廃棄します。

    Visual Basic
    codecs.Save(image, MultiTiff_Fname, RasterImageFormat.Tif, 0, 1, -1, 1, CodecsSavePageMode.Overwrit)
    
    C#
    codecs.Save(image, MultiTiff_Fname, RasterImageFormat.Tif, 0, 1, -1, 1, CodecsSavePageMode.Overwrit)
    

     (6)読み出した画像を、フォームに配置したRasterImageViewerコントロールで表示します。RasterImageViewerコントロールのSizeModeプロパティを使用し、アスペクト比を維持したまま画像をデスティネーション長方形に収めるようにします。プロパティの値はRasterPaintSizeMode列挙体のメンバで、以下の値を使用します。

    メンバ 解説
    Stretch 画像をデスティネーション長方形に合わせる。アスペクト比は維持されない
    FitWidth アスペクト比を維持したまま、画像の幅をデスティネーション長方形の幅に合わせる
    FitAlways 画像のサイズがデスティネーション長方形より小さい場合でも常に、アスペクト比を維持したまま画像をデスティネーション長方形に収める
    Fit アスペクト比を維持したまま、画像をデスティネーション長方形に収めます。画像のサイズがデスティネーション長方形より小さい場合、リサイズは行われない
    Normal サイズ設定しない

     次に、 RasterImageViewerコントロールのImageプロパティに、読み出したRasterImageオブジェクトを設定します。

     そして、最後のページをPageプロパティに設定します。RasterImageViewerコントロールのImageプロパティに設定したRasterImageオブジェクトが複数ページの画像を持っていれば、Pageプロパティを使用してどのページを表示するのかを指定できます。ここでは、ページの総数を表すPageCountプロパティを使用して、最後に追加した画像を表示し無事追加されていることが確認できるようにしています。

    Visual Basic
    Private filecount As Integer = 0
    Private image As RasterImage = Nothing
    
    Private Sub TIFFファイルの追加ToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles TIFFファイルの追加ToolStripMenuItem.Click
    
    (1)If MultiTiff_Fname = "" Then
            MessageBox.Show("保存するTiffファイルがありません。新規に作成してください")
            Exit Sub
            End If
    
         Dim add_tiff_fname As String = ""
    
    (2)’ RasterCodecsオブジェクトを初期化します。
            Dim codecs As New RasterCodecs()
    
    (3)OpenFileDialog1.Filter = "Tiffファイル(*.tif)| *.tif"
            OpenFileDialog1.FileName = "*.tif"
    
           If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
              add_tiff_fname = OpenFileDialog1.FileName
              Dim page As RasterImage = codecs.Load(add_tiff_fname)
    
    (4) If filecount = 0 Then
                  image = page
              Else
                  image.AddPage(page)
              End If
    
              filecount += 1
    
    (5) codecs.Save(image, MultiTiff_Fname, RasterImageFormat.Tif, 0, 1, -1, 1, CodecsSavePageMode.Overwrite)
    
              ' ビューワをFitモードに設定します。
    (6) RasterImageViewer1.SizeMode = RasterPaintSizeMode.Fit
              ' この画像を表示します。
              RasterImageViewer1.Image = image
              RasterImageViewer1.Image.Page = mage.PageCount
        End If
    End Sub
    
    C#
    private int filecount= 0;
    private RasterImage image = null;
    private void tIFFファイルの追加ToolStripMenuItem_Click(object sender, EventArgs e)
    {
    
    (1)if( MultiTiff_Fname == "")
        {
            MessageBox.Show("保存するTiffファイルがありません。新規に作成してください");
            return;
        }
       
            String add_tiff_fname = "";
    
    (2)// RasterCodecsオブジェクトを初期化します。
            RasterCodecs codecs = new RasterCodecs(); 
       
    (3)openFileDialog1.Filter = "Tiffファイル(*.tif)| *.tif";        
            openFileDialog1.FileName = "*.tif";
    
        if(openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            add_tiff_fname = openFileDialog1.FileName;
            RasterImage page= codecs.Load(add_tiff_fname);
    
    (4)if(filecount == 0) 
            {
                image = page;
            }else
            {
                image.AddPage(page);
            }
    
            filecount += 1;
    
    (5)codecs.Save(image, MultiTiff_Fname, RasterImageFormat.Tif, 0, 1, -1, 1, CodecsSavePageMode.Overwrite);
    
         // ビューワをFitモードに設定します
    (6)rasterImageViewer1.SizeMode = RasterPaintSizeMode.Fit;
    
            // この画像を表示します。
            rasterImageViewer1.Image = image;
            rasterImageViewer1.Image.Page = image.PageCount;
        }
    }
    

表示画像を移動するコントロールボタンの処理

 最後に、4つのボタンのClickイベントハンドラに、RasterImageViewerコントロールで表示する画像ページを移動する処理を作成します。これらの処理はとても簡単です。

 「前のページ」「次のページ」の移動は、Pageプロパティから現在表示されているページ番号を取得し、これを使って再度Pageプロパティに表示するページ番号を作成しセットするだけです。PageCountプロパティを参照すると、読み込んだRasterImageオブジェクトの総ページ数を取得できるため、この値をPageプロパティにセットすれば最後の画像ページを表示します。先頭のページ番号は「1」ですから、これをPageプロパティにセットすれば先頭の画像ページを表示します。

 そして、フォームのClosingイベントハンドラで、Shutdownメソッドをアプリケーションが終了する直前に呼び出し、実行します。

Visual Basic
Private Sub Pagetop_Click(sender As System.Object, e As System.EventArgs) Handles Pagetop.Click
    ' 最初のページに移動します。
    If (RasterImageViewer1.Image.Page <> 1) Then
        RasterImageViewer1.Image.Page = 1
    End If
End Sub

Private Sub BeforePage_Click(sender As System.Object, e As System.EventArgs) Handles BeforePage.Click
    ' 前のページに移動します。
    If (RasterImageViewer1.Image.Page > 1) Then
        RasterImageViewer1.Image.Page = RasterImageViewer1.Image.Page - 1
    End If
End Sub

Private Sub NextPage_Click(sender As System.Object, e As System.EventArgs) Handles NextPage.Click
    ' 次のページに移動します。
    If (RasterImageViewer1.Image.Page < RasterImageViewer1.Image.PageCount) Then
        RasterImageViewer1.Image.Page = RasterImageViewer1.Image.Page + 1
    End If
End Sub

Private Sub LastPage_Click(sender As System.Object, e As System.EventArgs) Handles LastPage.Click
    ' 最後のページに移動します。
    If (RasterImageViewer1.Image.Page <> RasterImageViewer1.Image.PageCount) Then
        RasterImageViewer1.Image.Page = RasterImageViewer1.Image.PageCount
    End If
End Sub

Private Sub Form1_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        RasterCodecs.Shutdown()
    End Sub
C#
private void Pagetop_Click(object sender, EventArgs e)
{
    // 最初のページに移動します。
    if (rasterImageViewer1.Image.Page != 1)
    {
        rasterImageViewer1.Image.Page = 1;
    }       
}

private void BeforePage_Click_1(object sender, EventArgs e)
{
    // 前のページに移動します。
    if (rasterImageViewer1.Image.Page > 1)
    {
        rasterImageViewer1.Image.Page--;
    }
}

private void NextPage_Click_1(object sender, EventArgs e)
{
    // 次のページに移動します。
    if (rasterImageViewer1.Image.Page < rasterImageViewer1.Image.PageCount)
    {
        rasterImageViewer1.Image.Page++;
    }
}

private void LastPage_Click_1(object sender, EventArgs e)
{
    // 最後のページに移動します。
    if (rasterImageViewer1.Image.Page != rasterImageViewer1.Image.PageCount)
    {
        rasterImageViewer1.Image.Page = rasterImageViewer1.Image.PageCount;
    }
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    RasterCodecs.Shutdown();
}
コード全文 Visual Basic
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.WinForms

Public Class Form1
    Private MultiTiff_Fname As String = ""
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ' 入出力ライブラリの起動に必要なデータを初期化します。
        RasterCodecs.Startup()
    End Sub
    Private Sub 新規作成ToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles 新規作成ToolStripMenuItem.Click
        SaveFileDialog1.Filter = "Tiffファイル(*.tif)| *.tif"
        SaveFileDialog1.FileName = "multi_tiff1.tif"
        If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            If MessageBox.Show("次のファイル名でマルチTIFFファイルを作成します。" + Environment.NewLine + SaveFileDialog1.FileName, "ファイル作成の確認", _
                               MessageBoxButtons.OKCancel, _
                               MessageBoxIcon.Question) = Windows.Forms.DialogResult.OK Then
                MultiTiff_Fname = SaveFileDialog1.FileName
            Else
                MessageBox.Show("ファイルの作成を中止しました")
            End If
        End If
    End Sub
    Private filecount As Integer = 0
    Private image As RasterImage = Nothing
    Private Sub TIFFファイルの追加ToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles TIFFファイルの追加ToolStripMenuItem.Click
        If MultiTiff_Fname = "" Then
            MessageBox.Show("保存するTiffファイルがありません。新規に作成してください")
            Exit Sub
        End If
        Dim add_tiff_fname As String = ""
        ' RasterCodecsオブジェクトを初期化します。
        Dim codecs As New RasterCodecs
        OpenFileDialog1.Filter = "Tiffファイル(*.tif)| *.tif"
        OpenFileDialog1.FileName = "*.tif"
        If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            add_tiff_fname = OpenFileDialog1.FileName
            Dim page As RasterImage = codecs.Load(add_tiff_fname)
            If filecount = 0 Then
                image = page
            Else
                image.AddPage(page)
            End If
            filecount += 1
            codecs.Save(image, MultiTiff_Fname, RasterImageFormat.Tif, 0, 1, -1, 1, CodecsSavePageMode.Overwrite)
            ' ビューワをFitモードに設定します。
            RasterImageViewer1.SizeMode = RasterPaintSizeMode.Fit
            ' この画像を表示します。
            RasterImageViewer1.Image = image
            RasterImageViewer1.Image.Page = image.PageCount
        End If
    End Sub
    Private Sub Pagetop_Click(sender As System.Object, e As System.EventArgs) Handles Pagetop.Click
        ' 最初のページに移動します。
        If (RasterImageViewer1.Image.Page <> 1) Then
            RasterImageViewer1.Image.Page = 1
        End If
    End Sub
    Private Sub BeforePage_Click(sender As System.Object, e As System.EventArgs) Handles BeforePage.Click
        ' 前のページに移動します。
        If (RasterImageViewer1.Image.Page > 1) Then
            RasterImageViewer1.Image.Page = RasterImageViewer1.Image.Page - 1
        End If
    End Sub
    Private Sub NextPage_Click(sender As System.Object, e As System.EventArgs) Handles NextPage.Click
        ' 次のページに移動します。
        If (RasterImageViewer1.Image.Page < RasterImageViewer1.Image.PageCount) Then
            RasterImageViewer1.Image.Page = RasterImageViewer1.Image.Page + 1
        End If
    End Sub
    Private Sub LastPage_Click(sender As System.Object, e As System.EventArgs) Handles LastPage.Click
        ' 最後のページに移動します。
        If (RasterImageViewer1.Image.Page <> RasterImageViewer1.Image.PageCount) Then
            RasterImageViewer1.Image.Page = RasterImageViewer1.Image.PageCount
        End If
    End Sub
    Private Sub Form1_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        RasterCodecs.Shutdown()
    End Sub
End Class
コード全文 C#
using Leadtools;
using Leadtools.Codecs;
using Leadtools.WinForms;
namespace Multi_Tiff_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            // 入出力ライブラリの起動に必要なデータを初期化します。
            RasterCodecs.Startup();
        }
        private String MultiTiff_Fname = "";
        private void 新規作成ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.saveFileDialog1.Filter =  "Tiffファイル(*.tif)| *.tif";
            this.saveFileDialog1.FileName = "multi_tiff1.tif";
            if(this.saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                if(MessageBox.Show("次のファイル名でマルチTIFFファイルを作成します。" + 
                                    Environment.NewLine + saveFileDialog1.FileName, 
                                    "ファイル作成の確認", MessageBoxButtons.OKCancel, 
                                    MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.OK)
                {
                    MultiTiff_Fname = saveFileDialog1.FileName;
                }else
                {
                    MessageBox.Show("ファイルの作成を中止しました");
                }
            }
            
        }
        private int filecount= 0;
        private RasterImage image = null;
        private void tIFFファイルの追加ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if( MultiTiff_Fname == "")
            {
                MessageBox.Show("保存するTiffファイルがありません。新規に作成してください");
                return;
            }
           
            String add_tiff_fname = "";
            
            // RasterCodecsオブジェクトを初期化します。
            RasterCodecs codecs = new RasterCodecs(); 
           
            openFileDialog1.Filter = "Tiffファイル(*.tif)| *.tif";        
            openFileDialog1.FileName = "*.tif";
            if(openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                add_tiff_fname = openFileDialog1.FileName;
                RasterImage page= codecs.Load(add_tiff_fname);
                if(filecount == 0) 
                {
                    image = page;
                }else
                {
                    image.AddPage(page);
                }
                filecount += 1;
                codecs.Save(image, MultiTiff_Fname, RasterImageFormat.Tif, 0, 1, -1, 1, CodecsSavePageMode.Overwrite);
                // ビューワをFitモードに設定します
                rasterImageViewer1.SizeMode = RasterPaintSizeMode.Fit;
                // この画像を表示します。
                rasterImageViewer1.Image = image;
                rasterImageViewer1.Image.Page = image.PageCount;
            }
        }
        private void Pagetop_Click(object sender, EventArgs e)
        {
            // 最初のページに移動します。
            if (rasterImageViewer1.Image.Page != 1)
            {
                rasterImageViewer1.Image.Page = 1;
            }       
        }
 
        private void BeforePage_Click_1(object sender, EventArgs e)
        {
            // 前のページに移動します。
            if (rasterImageViewer1.Image.Page > 1)
            {
                rasterImageViewer1.Image.Page--;
            }
        }
        private void NextPage_Click_1(object sender, EventArgs e)
        {
            // 次のページに移動します。
            if (rasterImageViewer1.Image.Page < rasterImageViewer1.Image.PageCount)
            {
                rasterImageViewer1.Image.Page++;
            }
        }
        private void LastPage_Click_1(object sender, EventArgs e)
        {
            // 最後のページに移動します。
            if (rasterImageViewer1.Image.Page != rasterImageViewer1.Image.PageCount)
            {
                rasterImageViewer1.Image.Page = rasterImageViewer1.Image.PageCount;
            }
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            RasterCodecs.Shutdown();
        }
    }
}

まとめ

 LEADTOOLS 16.5Jはとても機能が豊富で、1回の記事ではすべてを紹介しきれません。画像にコメントを入れたり、画像処理、スキャニング、アノテーション、OCR(光学式文字認識)機能など、画像を中心にドキュメントを作成する際に必要な、Faxや帳票などのビジネス文書の電子ドキュメント化を支援する幅広い機能を自作のアプリケーションに実装できます。

 今回は、マルチファイルTiffの作成について紹介しました。次回も引き続き、その豊富な機能を生かしたアプリケーション開発を紹介していきたいと思います。

【補足】マルチページTIFFの作成について

 マルチページTIFFの作成自体は、別エディションのImaging Proシリーズでも可能です。ただし、48、64ビットカラー画像、12、16、32ビットグレースケール画像を使用するには、Document Imagingが必要になります。

 詳しい内容を知りたい方は、以下の製品ホームページもご覧ください。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

    8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5