【C#】JPEG画像ファイルを8bitTIFFフォーマットに変換する(スキャン画像のファイルサイズを削減する)

大量のスキャン画像のファイルサイズを削減する必要があっていろいろ検証したので手法を覚書します

スキャン画像の概要
・2色刷りの印刷物に手書きしたもの
・ファイルフォーマットはJPEG

(タイトルに結論が書いてありますがw)PNG・GIFF・TIFFで比較したところ、
この条件では色深度を削ったTIFF形式がファイルサイズ・変換速度で優れていました。
見栄えを考慮すると8bitが限界でしたが、グレースケールなら4bitでもいけそうな感じ。
ただし、TIFFに変換できても色深度や圧縮形式まで指定できる方法は限られており、
簡易な方法では、調べた限りImageMagickくらいしかありませんでした。

今回の場合は大量の画像ファイルを処理する必要があったので、
C#でEncoderParametersを指定する手法を選択しました。

参考サイト
stackoverflow.com

using System.IO;
using System.Drawing;
using System.Drawing.Imaging;

// 変換する画像形式を設定する
ImageFormat imageFormat = ImageFormat.Tiff;
long colorDepth = 8L;
EncoderValue compression = EncoderValue.CompressionLZW;

// EncoderParametersを設定する
EncoderParameters parameters = new EncoderParameters(2);
parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, colorDepth);
parameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)compression);

// ImageCodecInfoを取得する
ImageCodecInfo imageCodecInfo = ImageCodecInfo.GetImageEncoders().FirstOrDefault(x => x.FormatID == imageFormat.Guid);

// 画像形式の拡張子を取得する
string extention = imageCodecInfo.FilenameExtension.Split(';')[0].Replace("*","").ToLower();

// ファイル名を設定する
string sourceFile = @"C:\temp\source.jpg";
string destinationFile = Path.GetDirectoryName(sourceFile) + @"\" + Path.GetFileNameWithoutExtension(sourceFile) + extention;

// 画像形式を変換する
using (Bitmap bitmap = new Bitmap(sourceFile))
{
    bitmap.Save(destinationFile, imageCodecInfo, parameters);
}