C# で画像のサイズを変更する

Muhammad Maisam Abbas 2024年2月16日
  1. Bitmap クラスを使って画像をリサイズする方法(C#)
  2. Graphics.DrawImage() 関数を使って画像をリサイズする方法(C#)
  3. 結論
C# で画像のサイズを変更する

このチュートリアルでは、C#で画像のサイズを変更する方法について説明します。

オリジナルの画像をロードして、リサイズしたバージョンを保存するまでの全体的なプロセスについて説明します。

Bitmap クラスを使って画像をリサイズする方法(C#)

Bitmap クラス には、C#で画像を操作するための多くのメソッドが用意されています。Bitmap クラスは画像のピクセルデータを取得することができます。Bitmap クラスのコンストラクタ内で Size パラメータを初期化することで、画像のサイズを変更することができます。

以下のコード例は、C#で Bitmap クラスのコンストラクタを使用して画像のサイズを変更する方法を示しています。

using System;
using System.Drawing;
namespace resize_image {
  class Program {
    public static Image resizeImage(Image imgToResize, Size size) {
      return (Image)(new Bitmap(imgToResize, size));
    }
    static void Main(string[] args) {
      string path = "C:\\Images\\img1.jpg";
      Image img = Image.FromFile(path);
      Bitmap imgbitmap = new Bitmap(img);
      Image resizedImage = resizeImage(imgbitmap, new Size(200, 200));
    }
  }
}

このコードでは、Bitmap クラスを使用してC#で画像のサイズ変更の完全なプロセスを示しています。どのように動作するかを解説していきましょう。

ステップ1:オリジナルの画像をロードする

まず、Image.FromFile メソッドを使用してオリジナルの画像をロードする必要があります。自分の画像ファイルへのパスに "C:\\Images\\img1.jpg" を置き換えてください。

string path = "C:\\Images\\img1.jpg";
Image img = Image.FromFile(path);

ステップ2:画像を Bitmap に変換する

次に、ロードした画像を Bitmap オブジェクトに変換します。このステップは、リサイズ操作を行うために必要です。

Bitmap imgBitmap = new Bitmap(img);

ステップ3:画像をリサイズする

ここからがリサイズの部分です。ResizeImage 関数は Bitmap オブジェクトと目標のサイズ (new Size(200, 200)) を受け取り、リサイズされた画像を返します。

Image resizedImage = ResizeImage(imgBitmap, new Size(200, 200));

ステップ4:リサイズされた画像を保存する

最後に、Save メソッドを使用してリサイズされた画像をファイルに保存することができます。この例では、リサイズされた画像は "resized.jpg" として保存されます。保存する画像の形式は、ファイル拡張子(例:.jpg.png.bmp)を変更することで選択できます。

resizedImage.Save("resized.jpg");

Graphics.DrawImage() 関数を使って画像をリサイズする方法(C#)

Graphics.DrawImage() 関数 は、指定した場所とサイズで画像を描画するための関数です。この方法では、画像のリサイズに関する多くの制約を解消することができます。以下のコード例は、Graphics.DrawImage() 関数を使用して画像をリサイズする方法を示しています。

using System;
using System.Drawing;
namespace resize_image {
  class Program {
    public static Image resizeImage(Image image, int width, int height) {
      var destinationRect = new Rectangle(0, 0, width, height);
      var destinationImage = new Bitmap(width, height);

      destinationImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

      using (var graphics = Graphics.FromImage(destinationImage)) {
        graphics.CompositingMode = CompositingMode.SourceCopy;
        graphics.CompositingQuality = CompositingQuality.HighQuality;

        using (var wrapMode = new ImageAttributes()) {
          wrapMode.SetWrapMode(WrapMode.TileFlipXY);
          graphics.DrawImage(image, destinationRect, 0, 0, image.Width, image.Height,
                             GraphicsUnit.Pixel, wrapMode);
        }
      }

      return (Image)destinationImage;
    }
    static void Main(string[] args) {
      string path = "C:\\Images\\img1.jpg";
      Image img = Image.FromFile(path);
      Bitmap imgbitmap = new Bitmap(img);
      Image resizedImage = resizeImage(imgbitmap, new Size(200, 200));
    }
  }
}

どのように動作するかを解説していきましょう。

ステップ1:オリジナルの画像をロードする

まず、Image.FromFile を使用してオリジナルの画像をロードする必要があります。自分の画像ファイルへのパスに "C:\\Images\\img1.jpg" を置き換えてください。

string path = "C:\\Images\\img1.jpg";
Image img = Image.FromFile(path);

ステップ2:目標となる Bitmap を作成する

リサイズされた画像を保持する目標となる Bitmap オブジェクトを作成します。 SetResolution を使用して、解像度を元の画像と一致させます。

destinationImage.SetResolution()関数は、実際のサイズに関係なく、画像のdpiを維持します。

var destinationRect = new Rectangle(0, 0, width, height);
var destinationImage = new Bitmap(width, height);

destinationImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

ステップ3:画像のリサイズ

次に、Graphics.FromImageを使用して、目的のBitmapに関連付けられた Graphicsオブジェクトを取得します。最高の結果を得るために、コンポジットモードと品質を設定します。

using (var graphics = Graphics.FromImage(destinationImage)) {
  graphics.CompositingMode = CompositingMode.SourceCopy;
  graphics.CompositingQuality = CompositingQuality.HighQuality;

  using (var wrapMode = new ImageAttributes()) {
    wrapMode.SetWrapMode(WrapMode.TileFlipXY);
    graphics.DrawImage(image, destinationRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel,
                       wrapMode);
  }
}

graphics.CompositingMode = CompositingMode.SourceCopyプロパティは、色が描画されるときに背景色を上書きすることを指定します。

graphics.CompositingQuality = CompositingQuality.HighQualityプロパティは、高品質の画像のみを描画することを指定します。

wrapMode.SetWrapMode(WrapMode.TileFlipXY)関数は、画像の境界周りのゴーストを防ぎます。

ステップ4:リサイズされた画像の保存

最後に、Saveメソッドを使用して、リサイズされた画像をファイルに保存できます。この例では、リサイズされた画像はresized.jpgとして保存されます。保存される画像の形式は、ファイル拡張子(例:.jpg.png.bmp)を変更することで選択できます。

resizedImage.Save("resized.jpg");

結論

画像のリサイズはソフトウェア開発における一般的なタスクであり、C#では複数のアプローチが提供されています。この記事では、Bitmapクラスを使用して画像のリサイズに焦点を当てました。元の画像の読み込みからリサイズ版の保存まで、全体のプロセスを解説しました。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

関連記事 - Csharp Image