マルチページ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(RasterImage,String,RasterImageFormat,Int32,Int32,Int32,Int32,CodecsSavePageMode)
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 _ )
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オブジェクトを廃棄します。
codecs.Save(image, MultiTiff_Fname, RasterImageFormat.Tif, 0, 1, -1, 1, CodecsSavePageMode.Overwrit)
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プロパティを使用して、最後に追加した画像を表示し無事追加されていることが確認できるようにしています。
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
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; } }
-
image