【C#】画像ファイルを指定したサイズ(幅×高さ)に変更する

大量の画像ファイルを指定の縦横サイズにリサイズする必要があり、手法を調べたのでノートします。

1.アスペクト比を維持しないでサイズ変更する
アスペクト比とは長辺と短辺の比率のことで、いわゆる画像の縦横比率です。
この方法では元画像と目的サイズのアスペクト比が異なる場合は、
縦横どちらかに間延びした画像に変わることになります。
最初に試した手法はこちらだったのですが、
目的に対しては好ましくないだろうということで方法2を模索することになりました。
念のためコード例を示します。

参考サイト
stackoverflow.com

using System.Drawing;

/// <summary>
/// 画像ファイルのアスペクト比を変更してサイズを変更します
/// </summary>
/// <param name="sourceFile">サイズ変更する画像ファイル</param>
/// <param name="destinationFile">サイズ変更した画像ファイル</param>
/// <param name="imageFormat">画像ファイル形式</param>
/// <param name="width">変更する幅</param>
/// <param name="height">変更する高さ</param>
public void ResizeImageWhileChangingAspectRatio(string sourceFile,
    string destinationFile,
    System.Drawing.Imaging.ImageFormat imageFormat,
    int width,
    int height)
{
    // サイズ変更する画像ファイルを開く
    using (Image image = Image.FromFile(sourceFile))
    {
        // サイズ変更した画像を作成する
        using (Bitmap bitmap = new Bitmap(width, height))
        using (Graphics graphics = Graphics.FromImage(bitmap))
        {
            // ラップモードを設定する
            using (System.Drawing.Imaging.ImageAttributes wrapMode = new System.Drawing.Imaging.ImageAttributes())
            {
                wrapMode.SetWrapMode(System.Drawing.Drawing2D.WrapMode.TileFlipXY);
                graphics.DrawImage(image, new Rectangle(0, 0, width, height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);

                // サイズ変更した画像を保存する
                bitmap.Save(destinationFile, imageFormat);
            }
        }
    }
}


2.アスペクト比を維持したままでサイズ変更する
目的サイズと元画像のアスペクト比が異なる場合は変更後の画像の右端or下端に空き領域ができてしまうので、
予め変更後の画像を塗りつぶしてから(コード例では黒)、サイズ変更した元画像を配置します。
なお、コード例では’変更サイズを取得する’の端数処理の関係で長辺の端に1ピクセルの背景色が残る場合があります。

参考サイト
stackoverflow.com

using System.Drawing;

/// <summary>
/// 画像ファイルのアスペクト比を維持してサイズを変更します
/// </summary>
/// <param name="sourceFile">サイズ変更する画像ファイル</param>
/// <param name="destinationFile">サイズ変更した画像ファイル</param>
/// <param name="imageFormat">画像ファイル形式</param>
/// <param name="width">変更する幅</param>
/// <param name="height">変更する高さ</param>
public void ResizeImageWhileMaintainingAspectRatio(string sourceFile, 
    string destinationFile, 
    System.Drawing.Imaging.ImageFormat imageFormat, 
    int width, 
    int height)
{
    // サイズ変更する画像ファイルを開く
    using (Image image = Image.FromFile(sourceFile))
    {
        // 変更倍率を取得する
        float scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height);

        // サイズ変更した画像を作成する
        using (Bitmap bitmap = new Bitmap(width, height))
        using (Graphics graphics = Graphics.FromImage(bitmap))
        {
            // 変更サイズを取得する
            int widthToScale = (int)(image.Width * scale);
            int heightToScale = (int)(image.Height * scale);

            // 背景色を塗る
            SolidBrush solidBrush = new SolidBrush(Color.Black);
            graphics.FillRectangle(solidBrush, new RectangleF(0, 0, width, height));

            // サイズ変更した画像に、左上を起点に変更する画像を描画する
            graphics.DrawImage(image, 0, 0, widthToScale, heightToScale);

            // サイズ変更した画像を保存する
            bitmap.Save(destinationFile, imageFormat);
        }
    }
}