C#でZIPファイル内の複数の画像ファイルをマルチTiffファイルに変換する

C# コンピュータ
C#

前回複数の画像ファイルからTiffファイルを作成出来ましたので、今回はzipファイル内の画像ファイルをtiffファイルに変換します。

ファイル名:Program.cs

using System.IO;
using System.IO.Compression;
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;
    }
    // ZIPファイル内の画像ファイルをマルチtiffファイルへ変換
    static public int ZipToTiff(string zipFile, string dstFile)
    {
        // Tiffエンコーダー
        TiffBitmapEncoder encoder = new()
        {
            Compression = TiffCompressOption.Zip,
        };

        using FileStream ifs = new (zipFile, FileMode.Open, FileAccess.Read);
        using ZipArchive zip = new ZipArchive(ifs);

        foreach(ZipArchiveEntry e in zip.Entries)
        {
            if (!Regex.IsMatch(e.FullName, _pattern, RegexOptions.IgnoreCase))
                continue;
            Console.WriteLine($"{e.FullName}");
            var stream = e.Open();
            using MemoryStream ms = new();
            stream.CopyTo(ms);
            ms.Seek(0, SeekOrigin.Begin);
            
            BitmapFrame frame = BitmapFrame.Create(
                ms, 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);
        }
        if (Regex.IsMatch(srcPath, @"\.zip$", RegexOptions.IgnoreCase))
        {
            return ZipToTiff(srcPath, dstFile);
        }

        return 1;
    }
}

コメント