Bitmapを保存する

C#のBitmapクラスはとてもよくできている。
なんでも「バチこい!」で取り込んでくれるわ、好きなように切り貼りできるわ、でもって好きなフォーマットで保存できる.


Bitmap bmpFromFile = new Bitmap(strSrcFilename);
bmpFromFile.Save(strDistFilename, System.Drawing.Imaging.ImageFormat.Jpeg);
このBitmap.Saveの第二引数をSystem.Drawing.Imaging.ImageFormatのプロパティから指定すれば、好きなフォーマットで保存できる。
主だったものは、JPEG, PNG, BMP, 昔はユニシス特許で大変だったGIFもある。
https://msdn.microsoft.com/ja-jp/library/system.drawing.imaging.imageformat%28v=vs.110%29.aspx

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);