[C#] Bitmapの画像をリサイズする方法を解説

C#でBitmap画像をリサイズするには、Graphicsクラスを使用します。

まず、元のBitmapオブジェクトを作成し、次に新しいサイズのBitmapを作成します。

Graphicsオブジェクトを使って、元の画像を新しいBitmapに描画します。

Graphics.DrawImageメソッドを使用して、元の画像を指定したサイズにリサイズできます。

描画後、リサイズされたBitmapを保存または使用することができます。

この記事でわかること
  • Bitmapオブジェクトの作成方法
  • 画像リサイズの具体的な手法
  • アスペクト比を維持する方法
  • 画質を向上させる設定
  • Webアプリでの画像処理の実例

目次から探す

Bitmapのリサイズ方法

Bitmapオブジェクトの作成

C#で画像を扱うためには、まずBitmapオブジェクトを作成する必要があります。

Bitmapオブジェクトは、画像ファイルをメモリに読み込むためのクラスです。

以下のサンプルコードでは、指定した画像ファイルからBitmapオブジェクトを作成しています。

using System.Drawing;
class Program
{
    static void Main()
    {
        // 画像ファイルのパスを指定
        string imagePath = "path/to/your/image.jpg";
        
        // Bitmapオブジェクトを作成
        Bitmap originalBitmap = new Bitmap(imagePath);
    }
}

出力結果は特にありませんが、originalBitmapに指定した画像が読み込まれます。

Graphicsクラスの利用

Bitmapオブジェクトをリサイズするためには、Graphicsクラスを使用します。

Graphicsクラスは、描画操作を行うためのクラスで、Bitmapオブジェクトに対して描画を行うことができます。

以下のコードでは、Graphicsオブジェクトを作成し、リサイズの準備をしています。

using System.Drawing;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        
        // リサイズ後のBitmapを作成
        Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
        
        // Graphicsオブジェクトを作成
        using (Graphics graphics = Graphics.FromImage(resizedBitmap))
        {
            // リサイズ処理を行う準備
        }
    }
}

出力結果は特にありませんが、resizedBitmapに新しいBitmapオブジェクトが作成されます。

DrawImageメソッドの使い方

GraphicsクラスDrawImageメソッドを使用して、元のBitmapをリサイズ後のBitmapに描画します。

このメソッドを使うことで、簡単に画像をリサイズすることができます。

以下のコードでは、DrawImageメソッドを使用してリサイズを行っています。

using System.Drawing;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
        
        using (Graphics graphics = Graphics.FromImage(resizedBitmap))
        {
            // 元のBitmapをリサイズ後のBitmapに描画
            graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
        }
    }
}

出力結果は特にありませんが、resizedBitmapにリサイズされた画像が描画されます。

リサイズ後のBitmapの保存方法

リサイズが完了したら、Bitmapをファイルに保存する必要があります。

BitmapクラスSaveメソッドを使用して、指定したパスに画像を保存できます。

以下のコードでは、リサイズ後のBitmapをJPEG形式で保存しています。

using System.Drawing;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
        
        using (Graphics graphics = Graphics.FromImage(resizedBitmap))
        {
            graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
        }
        
        // リサイズ後のBitmapを保存
        resizedBitmap.Save("path/to/save/resized_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
}

出力結果は特にありませんが、指定したパスにリサイズされた画像が保存されます。

リサイズ時のアスペクト比の維持方法

リサイズ時にアスペクト比を維持するためには、元の画像の幅と高さの比率を計算し、それに基づいて新しいサイズを決定する必要があります。

以下のコードでは、アスペクト比を維持しながらリサイズを行っています。

using System.Drawing;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        
        // アスペクト比を維持するための新しいサイズを計算
        int newWidth = 100; // 新しい幅
        int newHeight = (int)(originalBitmap.Height * (newWidth / (float)originalBitmap.Width)); // 新しい高さ
        
        Bitmap resizedBitmap = new Bitmap(newWidth, newHeight); // 新しいBitmapを作成
        
        using (Graphics graphics = Graphics.FromImage(resizedBitmap))
        {
            graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
        }
        
        resizedBitmap.Save("path/to/save/resized_image_aspect_ratio.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
}

出力結果は特にありませんが、指定したパスにアスペクト比を維持したリサイズ画像が保存されます。

リサイズ時の画質調整

Graphicsの補間モードの設定

リサイズ時の画質を向上させるためには、Graphicsクラスの補間モードを設定することが重要です。

補間モードは、画像を拡大または縮小する際に、どのようにピクセルを計算するかを決定します。

以下のコードでは、補間モードを設定する方法を示しています。

using System.Drawing;
using System.Drawing.Drawing2D;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
        
        using (Graphics graphics = Graphics.FromImage(resizedBitmap))
        {
            // 補間モードを高品質に設定
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            
            graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
        }
        
        resizedBitmap.Save("path/to/save/resized_image_interpolation.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
}

出力結果は特にありませんが、指定したパスに高品質な補間を使用したリサイズ画像が保存されます。

SmoothingModeの設定

SmoothingModeは、描画時の滑らかさを制御するための設定です。

これを適切に設定することで、リサイズ後の画像のエッジが滑らかになり、画質が向上します。

以下のコードでは、SmoothingModeを設定する方法を示しています。

using System.Drawing;
using System.Drawing.Drawing2D;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
        
        using (Graphics graphics = Graphics.FromImage(resizedBitmap))
        {
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            // SmoothingModeを高品質に設定
            graphics.SmoothingMode = SmoothingMode.AntiAlias;
            
            graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
        }
        
        resizedBitmap.Save("path/to/save/resized_image_smoothing.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
}

出力結果は特にありませんが、指定したパスに滑らかなエッジを持つリサイズ画像が保存されます。

PixelOffsetModeの設定

PixelOffsetModeは、ピクセルの描画位置を制御するための設定です。

これを適切に設定することで、リサイズ後の画像のピクセルがより正確に配置され、画質が向上します。

以下のコードでは、PixelOffsetModeを設定する方法を示しています。

using System.Drawing;
using System.Drawing.Drawing2D;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
        
        using (Graphics graphics = Graphics.FromImage(resizedBitmap))
        {
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.SmoothingMode = SmoothingMode.AntiAlias;
            // PixelOffsetModeを設定
            graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
            
            graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
        }
        
        resizedBitmap.Save("path/to/save/resized_image_pixel_offset.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
}

出力結果は特にありませんが、指定したパスに高品質なピクセル配置を持つリサイズ画像が保存されます。

高品質なリサイズを行うためのポイント

高品質なリサイズを行うためには、以下のポイントに注意することが重要です。

スクロールできます
ポイント説明
補間モードの設定InterpolationMode.HighQualityBicubicを使用する。
SmoothingModeの設定SmoothingMode.AntiAliasを使用する。
PixelOffsetModeの設定PixelOffsetMode.HighQualityを使用する。
画像のアスペクト比を維持幅と高さの比率を計算してリサイズする。
画像の保存形式を選択JPEGやPNGなど、適切な形式で保存する。

これらのポイントを考慮することで、リサイズ後の画像の画質を最大限に保つことができます。

リサイズの具体的なコード例

固定サイズにリサイズする方法

固定サイズにリサイズする場合、指定した幅と高さに画像を変更します。

以下のコードでは、元の画像を100×100ピクセルにリサイズしています。

using System.Drawing;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        
        // 固定サイズにリサイズ
        Bitmap resizedBitmap = new Bitmap(100, 100); // 100x100ピクセルにリサイズ
        
        using (Graphics graphics = Graphics.FromImage(resizedBitmap))
        {
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
        }
        
        resizedBitmap.Save("path/to/save/fixed_size_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
}

出力結果は特にありませんが、指定したパスに固定サイズのリサイズ画像が保存されます。

比率を維持してリサイズする方法

アスペクト比を維持してリサイズする場合、元の画像の幅と高さの比率を計算し、それに基づいて新しいサイズを決定します。

以下のコードでは、幅を100ピクセルに設定し、高さを自動的に計算しています。

using System.Drawing;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        
        // アスペクト比を維持するための新しいサイズを計算
        int newWidth = 100; // 新しい幅
        int newHeight = (int)(originalBitmap.Height * (newWidth / (float)originalBitmap.Width)); // 新しい高さ
        
        Bitmap resizedBitmap = new Bitmap(newWidth, newHeight); // 新しいBitmapを作成
        
        using (Graphics graphics = Graphics.FromImage(resizedBitmap))
        {
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
        }
        
        resizedBitmap.Save("path/to/save/aspect_ratio_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
}

出力結果は特にありませんが、指定したパスにアスペクト比を維持したリサイズ画像が保存されます。

縦横比を無視してリサイズする方法

縦横比を無視してリサイズする場合、指定した幅と高さに強制的に変更します。

以下のコードでは、元の画像を150×100ピクセルにリサイズしています。

using System.Drawing;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        
        // 縦横比を無視してリサイズ
        Bitmap resizedBitmap = new Bitmap(150, 100); // 150x100ピクセルにリサイズ
        
        using (Graphics graphics = Graphics.FromImage(resizedBitmap))
        {
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
        }
        
        resizedBitmap.Save("path/to/save/ignore_aspect_ratio_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
}

出力結果は特にありませんが、指定したパスに縦横比を無視したリサイズ画像が保存されます。

応用例

サムネイル画像の生成

サムネイル画像は、元の画像の縮小版で、通常はウェブサイトやアプリケーションでの表示に使用されます。

以下のコードでは、元の画像からサムネイルを生成し、アスペクト比を維持しながらリサイズしています。

using System.Drawing;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        
        // サムネイルのサイズを指定
        int thumbnailWidth = 150; // 幅
        int thumbnailHeight = (int)(originalBitmap.Height * (thumbnailWidth / (float)originalBitmap.Width)); // 高さ
        
        Bitmap thumbnailBitmap = new Bitmap(thumbnailWidth, thumbnailHeight); // サムネイル用のBitmapを作成
        
        using (Graphics graphics = Graphics.FromImage(thumbnailBitmap))
        {
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            graphics.DrawImage(originalBitmap, 0, 0, thumbnailBitmap.Width, thumbnailBitmap.Height);
        }
        
        thumbnailBitmap.Save("path/to/save/thumbnail_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
}

出力結果は特にありませんが、指定したパスにサムネイル画像が保存されます。

バッチ処理で複数画像をリサイズする方法

複数の画像を一度にリサイズするバッチ処理を行うことも可能です。

以下のコードでは、指定したフォルダ内のすべての画像をリサイズし、別のフォルダに保存しています。

using System.Drawing;
using System.IO;
class Program
{
    static void Main()
    {
        string inputFolder = "path/to/your/input_folder/";
        string outputFolder = "path/to/your/output_folder/";
        
        // 入力フォルダ内のすべての画像ファイルを取得
        string[] imageFiles = Directory.GetFiles(inputFolder, "*.jpg");
        
        foreach (string imagePath in imageFiles)
        {
            Bitmap originalBitmap = new Bitmap(imagePath);
            Bitmap resizedBitmap = new Bitmap(100, 100); // 固定サイズにリサイズ
            
            using (Graphics graphics = Graphics.FromImage(resizedBitmap))
            {
                graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
            }
            
            // 出力ファイル名を生成
            string outputFileName = Path.Combine(outputFolder, Path.GetFileName(imagePath));
            resizedBitmap.Save(outputFileName, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
    }
}

出力結果は特にありませんが、指定した出力フォルダにリサイズされた画像が保存されます。

Webアプリケーションでの画像リサイズ

Webアプリケーションでは、ユーザーがアップロードした画像をリサイズすることがよくあります。

以下のコードは、ASP.NET Coreを使用して、アップロードされた画像をリサイズする例です。

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Drawing;
using System.IO;
using System.Threading.Tasks;
public class ImageController : Controller
{
    [HttpPost("upload")]
    public async Task<IActionResult> Upload(IFormFile file)
    {
        if (file != null && file.Length > 0)
        {
            using (var stream = new MemoryStream())
            {
                await file.CopyToAsync(stream);
                Bitmap originalBitmap = new Bitmap(stream);
                
                // リサイズ処理
                Bitmap resizedBitmap = new Bitmap(100, 100);
                using (Graphics graphics = Graphics.FromImage(resizedBitmap))
                {
                    graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
                }
                
                // リサイズした画像を保存または返却
                using (var outputStream = new MemoryStream())
                {
                    resizedBitmap.Save(outputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                    return File(outputStream.ToArray(), "image/jpeg", "resized_image.jpg");
                }
            }
        }
        return BadRequest("No file uploaded.");
    }
}

出力結果は特にありませんが、アップロードされた画像がリサイズされ、クライアントに返却されます。

動的にリサイズして表示する方法

動的に画像をリサイズして表示する場合、リクエストに応じて画像をリサイズすることができます。

以下のコードは、ASP.NET Coreで動的に画像をリサイズして表示する例です。

using Microsoft.AspNetCore.Mvc;
using System.Drawing;
using System.IO;
public class ImageController : Controller
{
    [HttpGet("image/{width}/{height}")]
    public IActionResult GetImage(int width, int height)
    {
        string imagePath = "path/to/your/image.jpg";
        Bitmap originalBitmap = new Bitmap(imagePath);
        
        Bitmap resizedBitmap = new Bitmap(width, height);
        using (Graphics graphics = Graphics.FromImage(resizedBitmap))
        {
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
        }
        
        using (var outputStream = new MemoryStream())
        {
            resizedBitmap.Save(outputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            return File(outputStream.ToArray(), "image/jpeg");
        }
    }
}

出力結果は特にありませんが、指定した幅と高さでリサイズされた画像が表示されます。

メモリ効率を考慮したリサイズ処理

メモリ効率を考慮したリサイズ処理では、使用するメモリを最小限に抑えるために、必要なときにのみBitmapオブジェクトを作成し、使用後は適切に解放することが重要です。

以下のコードでは、リサイズ処理を行った後にBitmapオブジェクトをDisposeしています。

using System.Drawing;
class Program
{
    static void Main()
    {
        string imagePath = "path/to/your/image.jpg";
        using (Bitmap originalBitmap = new Bitmap(imagePath))
        {
            // リサイズ処理
            using (Bitmap resizedBitmap = new Bitmap(100, 100)) // 固定サイズにリサイズ
            {
                using (Graphics graphics = Graphics.FromImage(resizedBitmap))
                {
                    graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    graphics.DrawImage(originalBitmap, 0, 0, resizedBitmap.Width, resizedBitmap.Height);
                }
                
                resizedBitmap.Save("path/to/save/memory_efficient_image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
            } // resizedBitmapはここでDisposeされる
        } // originalBitmapもここでDisposeされる
    }
}

出力結果は特にありませんが、指定したパスにメモリ効率を考慮したリサイズ画像が保存されます。

よくある質問

リサイズ後の画像がぼやけるのはなぜ?

リサイズ後の画像がぼやける原因はいくつかあります。

主な理由は以下の通りです。

  • 補間モードの設定: リサイズ時に使用する補間モードが低品質な設定になっていると、画像がぼやけることがあります。

InterpolationMode.HighQualityBicubicなどの高品質な補間モードを使用することが推奨されます。

  • 元の画像の解像度: 元の画像の解像度が低い場合、リサイズ後にピクセルが引き伸ばされるため、ぼやけた印象を与えることがあります。
  • リサイズの比率: 縦横比を無視してリサイズすると、画像が歪んで見えることがあり、これもぼやけた印象を与える要因となります。

リサイズ時にアスペクト比を維持するにはどうすればいい?

アスペクト比を維持してリサイズするためには、以下の手順を踏むことが重要です。

  1. 元の画像の幅と高さを取得: 画像の元の幅と高さを取得します。
  2. 新しいサイズを計算: 新しい幅を指定し、それに基づいて新しい高さを計算します。

計算式は次の通りです。

\[ \text{新しい高さ} = \text{元の高さ} \times \left( \frac{\text{新しい幅}}{\text{元の幅}} \right) \]

  1. リサイズ処理を行う: 計算した新しい幅と高さを使用してリサイズを行います。

リサイズ後の画像をJPEGやPNG形式で保存するには?

リサイズ後の画像をJPEGやPNG形式で保存するには、BitmapクラスSaveメソッドを使用します。

以下のように、保存する形式を指定することができます。

  • JPEG形式で保存:
  resizedBitmap.Save("path/to/save/image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
  • PNG形式で保存:
  resizedBitmap.Save("path/to/save/image.png", System.Drawing.Imaging.ImageFormat.Png);

このように、保存するファイル名の拡張子と、ImageFormatを指定することで、希望する形式で画像を保存できます。

まとめ

この記事では、C#を使用してBitmap画像をリサイズする方法について詳しく解説しました。

リサイズの具体的な手法や、画質を保つための設定、さらには実際の応用例に至るまで、幅広く取り上げています。

これを機に、画像処理の技術を活用して、さまざまなプロジェクトに取り組んでみてはいかがでしょうか。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 画像 (21)
  • URLをコピーしました!
目次から探す