BitmapをJPEGで画質を指定して保存する

さてJPEG、知っている方には言わずもがな、圧縮率と画質の間にトレードオフがある。
ちょっと気の利いた画像加工ソフトや、デジタル一眼のRAW現像ソフトなどでは、JPEG保存を指定するときに画質の指定ができる。
これが.net FrameworkのBitmapクラスでも実装されている。


Save(string filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
ImageCodecInfoはSystem.Drawing.Imaging.ImageCodecInfo.GetImageEncodersをenumerateすることで、どのフォーマットのCODECが現在のOSでサポートされているかが分かる。
ここからJPEGの物を取得すればよい。

System.Drawing.Imaging.ImageCodecInfo imgcdcinfJPEG = null;
foreach (var imgcdcinfEach in System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders())
{
if (imgcdcinfEach.FormatID == System.Drawing.Imaging.ImageFormat.Jpeg.Guid)
imgcdcinfJPEG = imgcdcinfEach;
}
次にEncoderParametersだが、これはJPEG用にひとつだけ設定すればよい。

int QualityParamJPEG = 100;
var encparamJPG = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, QualityParamJPEG);
var encparamsJPG = new System.Drawing.Imaging.EncoderParameters(1);
encparamsJPG.Param[0] = encparamJPG;
上記で設定している"QualityParamJPEG"が画質を決めるパラメータで、0が圧縮率最大、100が画質最高だ。


ちなみに、ImageCodecInfoが取得できれば、それで使用する拡張子も取得できる。


string strFileExtentionJPG = System.IO.Path.GetExtension(
imgcdcinfJPEG.FilenameExtension.Split(';')[0]
).ToLower();
わずか一行だ。
あとは、こんな感じでBitmapを保存すればよい。

bmpFromFile.Save(strDistFilename + strFileExtentionJPG, imgcdcinfJPEG, encparamsJPG);