前回複数の画像ファイルから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;
}
}
コメント