C#でディレクトリ内の複数の画像ファイルをマルチTiffファイルに変換する

C# コンピュータ
C#

複数の画像ファイルをtiff形式にアーカイブします。

ファイル名:Program.cs

using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Media.Imaging;

class Program
{
    readonly static string _pattern = @"\.(png|jpg|jpeg|bmp)$";
    // 画像ファイルをtiffファイルへ変換
    static public int ImgToTiff(string srcFile, string dstFile)
    {
        using FileStream ifs = new (srcFile, FileMode.Open, FileAccess.Read);

        // Tiffエンコーダー
        TiffBitmapEncoder encoder = new()
        {
            Compression = TiffCompressOption.Default,
        };

        // BitmapFrame
        BitmapFrame frame = BitmapFrame.Create(
            ifs, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);

        // エンコーダーに追加
        encoder.Frames.Add(frame);

        // 書き込み
        using FileStream ofs = new (dstFile, FileMode.Create, FileAccess.Write);
        encoder.Save(ofs);

        return 0;
    }
    // ディレクトリ内の画像ファイルをマルチtiffファイルへ変換
    static public int DirToTiff(string srcDir, string dstFile)
    {
        // Tiffエンコーダー
        TiffBitmapEncoder encoder = new()
        {
            Compression = TiffCompressOption.Zip,
        };

        // ファイルの一覧
        foreach(string file in Directory.EnumerateFiles(srcDir))
        {
            if (!Regex.IsMatch(file, _pattern, RegexOptions.IgnoreCase))
                continue;
            Console.WriteLine($"{file}");

            // フレームの追加
            using FileStream ifs = new (file, FileMode.Open, FileAccess.Read);
            BitmapFrame frame = BitmapFrame.Create(
                ifs, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
            encoder.Frames.Add(frame);
        }

        // 書き込み
        using FileStream ofs = new (dstFile, FileMode.Create, FileAccess.Write);
        encoder.Save(ofs);
        return 0;
    }
    static public int Main(string[] args)
    {
        if (args.Length < 1)
        {
            Console.WriteLine("ImgToTiff src.png dst.tif");
            return 1;
        }

        string dstFile = @".\sample.tif";
        if (args.Length > 1)
        {
            dstFile = args[1];
        }
        string srcPath = args[0];

        if (Regex.IsMatch(srcPath, _pattern, RegexOptions.IgnoreCase))
        {
            return ImgToTiff(srcPath, dstFile);
        }
        if (Directory.Exists(srcPath))
        {
            return DirToTiff(srcPath, dstFile);
        }

        return 1;
    }
}

ハマった点として、前回は問題なかったのですがBitmapFrame.Create()でframeオブジェクトの作成する際、BitmapCreateOptions.NoneとBitmapCacheOption.OnLoadを追加しないと例外(COMエラー)が発生しました。
また、大きいサイズのファイルをテストしたところtiffファイルのサイズが4GByteあたりで例外が発生しました。

コメント