【C#】マルチTIFFを分解する方法(How to split multi page tiff in C#)

皆さんこんにちはこんばんは、まずここブログを運営してます「よーす」です。

 

今日は、マルチページのTIFFを分解して単一のTIFFにする方法を紹介したいと思います。私自身今日までやり方を知らなかったので、今日調べのちょっと薄い内容になりますが少しでも困っている人の目に留まれば嬉しいです。

OCR処理をしている方は、結構TIFFファイルを扱うことが多いので参考になると思います。

 

それでは、Tiffを分解して行きましょう!!

開発環境

  • Windows 10
  • 64ビット
  • C#/Visual Studio 2019
  • .Net Frameword 4.7.2

分解に必要な参照を追加しよう

今回私が行う方法でのマルチTiffの分解には、追加の必要な参照が2つあります。

以下の2つを参照より追加してください。

参照必要項目

  • PresentataionCore
  • WiondowsBase

 

以下の画像を参考して頂ければ、見つけやすいと思います。

PresentatationCore

PresentataionCore

 

WindowsBase

WindowsBase

 

 

C#で実際にマルチTIFFを分解するコード書いてみよう

準備ができたら、実際にC#でコーディングして行きましょう。

コード内容は、コメントで記載してあるのでそちらを参考にしてください。

// マルチTiffの画像パス
string imgPath = @""; // 使用するマルチTIFFファイルのフルパスをいれてください。

// 読み込み用のStreamを作成する
System.IO.Stream imageStreamSource = new System.IO.FileStream(testPath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);

// デコーダーを作成
System.Windows.Media.Imaging.TiffBitmapDecoder decoder = new System.Windows.Media.Imaging.TiffBitmapDecoder(
    imageStreamSource, 
    System.Windows.Media.Imaging.BitmapCreateOptions.PreservePixelFormat,
    System.Windows.Media.Imaging.BitmapCacheOption.Default);

// ページ数を取得します。
int pagecount = decoder.Frames.Count;

// ページ数が1以上の時のみ処理を実行します。
if (pagecount > 1)
{
    //分解したファイルに付ける時にオリジナルファイルの名称もあった方がよいでの、ファイル名を取得します。
    string fileName = System.IO.Path.GetFileNameWithoutExtension(imgPath);

    //ファイルのパスを取得します。
    string filePath = System.IO.Path.GetDirectoryName(imgPath);

    //ページ数の文だけ処理を実行する
    for (int i = 0; i < pagecount; i++)
    {
        //分解後のファイル名を決めます。
        string outputName = string.Format(@"{0}\SplitImages\{1}-{2}.tif", filePath, fileName, i.ToString("000"));

        // 書き込み用のStreamを作成する
        System.IO.FileStream stream = new System.IO.FileStream(
            outputName, //出力先のフルパス
            System.IO.FileMode.Create,
            System.IO.FileAccess.Write);

        // エンコーダーを作成
        System.Windows.Media.Imaging.TiffBitmapEncoder encoder = new System.Windows.Media.Imaging.TiffBitmapEncoder();

        // イメージ内の個々のフレームを設定
        encoder.Frames.Add(decoder.Frames[i]);

        // streamに入っている情報を元に画像を保存する
        encoder.Save(stream);

        //毎回ちゃんとDisposeする。しないとメモリが破裂します。
        stream.Dispose();
    }
    //毎回ちゃんとDisposeする。しないとメモリが破裂します。
    imageStreamSource.Dispose();
}

以上のコードでTiffの分解をできます。

 

最後に

今回参考にさせて頂いたサイトを紹介して終わりにしたいと思います。

特にcloud6.netさんのコードはほぼコピーと言ってもいいぐらい参考にさせて頂きました。

ありがとうございます。

  • B!