複数の画像ファイルを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あたりで例外が発生しました。
コメント