C# で画像をトリミングする

Abdullahi Salawudeen 2023年10月12日
  1. C#Graphics.DrawImage() メソッドを使用して画像を描画およびトリミングする
  2. DrawImage() を 5つのパラメーターで使用して C# で画像をトリミングする
  3. DrawImage() を指定された部分、場所、およびサイズで使用して C# で画像をトリミングする
C# で画像をトリミングする

この記事では、C# コードを使用して、特定の画像を指定した場所に元のサイズで描画およびトリミングする方法を紹介します。

C#Graphics.DrawImage() メソッドを使用して画像を描画およびトリミングする

グラフィックスは System.Drawing 名前空間にあり、主に .Net ベースの Windows アプリケーションでグラフィックスや画像を表示または描画するために使用されます。 .Net は、ペン、ブラシ、四角形、円などのグラフィックス オブジェクトと図形を処理するための複数のクラスを提供します。

Graphics および Image .Net クラスは、Windows フォームに画像をレンダリングできます。 DrawImage() 関数は、指定された位置に画像の一部を描画します。

以下は DrawImage 関数のコード スニペットです。

public void DrawImage(System.Drawing.Image image, float x, float y,
                      System.Drawing.RectangleF srcRect, System.Drawing.GraphicsUnit srcUnit);

パラメータについては、以下で説明します。

  • image - 描画する画像を指定します。
  • x - 画像の x 座標を指定します。
  • y - 画像の y 座標を指定します。
  • srcRect - 描画する画像の部分を指定する RectangleF 構造。
  • srcUnit - srcRect で使用される測定単位を指定する GraphicsUnit 列挙のメンバー。

次のコード例は、Windows フォームと PaintEventArgs e をパラメーターとして持つ Paint イベント ハンドラーを使用して実装されています。

以下は、実行された列挙されたアクションです。

  1. 画像は、C:\Users\lolaa\Downloads フォルダにある JPEG ファイル Koala.jpg から作成されました。
  2. 画像を描画するための座標が作成されました。
  3. イメージの一部を抽出するために、ソースの四角形が作成されました。
  4. 測定単位はピクセルに設定されました。
  5. 画面に画像が描画されました。

指定されたソース四角形のサイズによって、画面に描画される元のスケーリングされていないイメージの部分が決まりました。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CreatingImageObject {
  public partial class Form1 : Form {
    Image img = null;
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    private void button1_Click(object sender, EventArgs e) {
      if (img == null) {
        img = Image.FromFile(@"C:\Users\lolaa\Downloads\Koala.jpg");
      }
    }

    private void Form1_Paint(object sender, PaintEventArgs e) {
      if (img != null) {
        // Graphics g = e.Graphics;
        Graphics g = this.CreateGraphics();
        g.DrawImage(img, 0, 0, this.Width, this.Height);

        g.Dispose();
      }
    }
  }
}

出力:

アプリのランディングページ

ボタンをクリックすると、以下の画像が表示されます。

出力:

画像 - 画面に描かれたコアラ

Rectangle cropRect = new Rectangle(...);
Bitmap src = Image.FromFile(fileName) as Bitmap;
Bitmap target = new Bitmap(cropRect.Width, cropRect.Height);

using (Graphics g = Graphics.FromImage(target)) {
  g.DrawImage(src, new Rectangle(0, 0, target.Width, target.Height), cropRect, GraphicsUnit.Pixel);
}

DrawImage() を 5つのパラメーターで使用して C# で画像をトリミングする

前に描いた画像を編集またはトリミングするには、DrawImage(Image, Single, Single, RectangleF, GraphicsUnit) 関数を使用できます。 関数内で 5つのパラメーターを使用したことがわかります。

上記のコードを更新すると、異なる出力が得られます。 以下は、更新されたコード例です。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CreatingImageObject {
  public partial class Form1 : Form {
    Image img = null;
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    private void button1_Click(object sender, EventArgs e) {
      if (img == null) {
        // Create image.
        img = Image.FromFile(@"C:\Users\lolaa\Downloads\Koala.jpg");
      }
    }

    private void Form1_Paint(object sender, PaintEventArgs e) {
      if (img != null) {
        Graphics g = this.CreateGraphics();

        // specify the coordinates for upper-left corner of image.
        float x = 100.0F;
        float y = 100.0F;

        // rectangle is created for the source image with custom dimensions.
        RectangleF srcRect = new RectangleF(50.0F, 50.0F, 150.0F, 150.0F);
        GraphicsUnit dim = GraphicsUnit.Pixel;

        // image is drawn to the screen.
        g.DrawImage(img, x, y, srcRect, dim);
        g.Dispose();
      }
    }
  }
}

出力:

画像 - コアラのトリミング画像

DrawImage() を指定された部分、場所、およびサイズで使用して C# で画像をトリミングする

DrawImage() 関数を使用して、選択した画像の指定した部分を指定した場所に指定したサイズで描画することもできます。

構文:

public void DrawImage(System.Drawing.Image image, System.Drawing.Rectangle destRect, float srcX,
                      float srcY, float srcWidth, float srcHeight,
                      System.Drawing.GraphicsUnit srcUnit,
                      System.Drawing.Imaging.ImageAttributes? imageAttrs,
                      System.Drawing.Graphics.DrawImageAbort? callback, IntPtr callbackData);

上記のコードを更新すると、異なる出力が得られます。 以下は、更新されたコード例です。

パラメータについては、以下で説明します。

  • image - 描画する画像を指定します。
  • destRect - 画面上の画像の位置とサイズを指定します。 描画された画像を四角形に合わせてスケーリングします。
  • srcXsrcY - 画像の左上隅の x 座標と y 座標。
  • srcWidthsrcHeight - 画像の幅と高さをそれぞれ指定します。
  • srcUnit - GraphicsUnit 列挙に属します。 srcRect パラメータで使用される測定単位です。
  • imageAttrs - 画像オブジェクトの色変更とガンマ情報を指定する ImageAttributes インスタンス。
  • callback - Graphics.DrawImageAbort のデリゲート関数。 画像を描画するときに呼び出す DrawImage() オーバーロードを指定します。 アプリケーションの仕様によって、このメソッドが呼び出される回数が決まります。
  • callbackData - Graphics.DrawImageAbort デリゲートが DrawImage メソッドの実行を停止するかどうかをチェックするときに使用する追加データを値で指定します。

以下のコードの例も、Windows フォームと PaintEventArgs e をパラメーターとする Paint イベント ハンドラーを使用して実装されています。

コードは次のアクションを実行します。

  1. Graphics.DrawImageAbort コールバック メソッドのインスタンスが作成されました。
  2. C:\Users\lolaa\Downloads フォルダーにある Koala.jpg 画像が作成されました。
  3. イメージを描画するための宛先長方形のポイントが作成されました。
  4. 描画するイメージの部分を指定するために、長方形のコンテナーが作成されました。
  5. グラフィック描画単位はピクセルに設定されました。
  6. 元の画像が画面に描画されました。
  7. 調整された画像を描画するための追加の四角形コンテナー。
  8. 調整された画像の属性をより大きなガンマ値に設定します。
  9. 調整した画像が画面に描画されました。

Graphics.DrawImageAbort コールバックは、DrawImage メソッドの実行を決定する bool を返します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CreatingImageObject {
  public partial class Form1 : Form {
    Image img = null;
    public Form1() {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {}

    // Define DrawImageAbort callback method.
    private bool DrawImageCallback8(IntPtr callBackData) {
      // Test for call that passes callBackData parameter.
      if (callBackData == IntPtr.Zero) {
        // If no callBackData passed, abort the DrawImage method.
        return true;
      } else {
        // If callBackData passed, continue DrawImage method.
        return false;
      }
    }
    private void button1_Click(object sender, EventArgs e) {
      if (img == null) {
        // Create image.
        img = Image.FromFile(@"C:\Users\lolaa\Downloads\Koala.jpg");
      }
    }

    private void Form1_Paint(object sender, PaintEventArgs e) {
      if (img != null) {
        Graphics g = this.CreateGraphics();

        // Create a call-back method.
        Graphics.DrawImageAbort imageCallback = new Graphics.DrawImageAbort(DrawImageCallback8);
        IntPtr imageCallbackData = new IntPtr(1);

        // Create image.
        // Image newImage = Image.FromFile(@"C:\Users\lolaa\Downloads\Koala.jpg");
        // img = Image.FromFile(@"C:\Users\lolaa\Downloads\Koala.jpg");

        // rectangle for the original image.
        Rectangle destRectOriginal = new Rectangle(100, 25, 450, 150);

        // coordinates of the rectangle.
        float x = 50.0F;
        float y = 50.0F;
        float width = 150.0F;
        float height = 150.0F;
        GraphicsUnit dim = GraphicsUnit.Pixel;

        // Draw original image to screen.
        g.DrawImage(img, destRectOriginal, x, y, width, height, dim);

        // rectangle for the adjusted image.
        Rectangle destRectAdjusted = new Rectangle(100, 175, 450, 150);

        // image attributes and sets gamma.
        ImageAttributes imageAttribute = new ImageAttributes();
        imageAttribute.SetGamma(4.0F);

        // Draw adjusted image to screen.
        try {
          checked {
            // Draw adjusted image to screen.
            g.DrawImage(img, destRectAdjusted, x, y, width, height, dim, imageAttribute,
                        imageCallback, imageCallbackData);
          }
        } catch (Exception ex) {
          g.DrawString(ex.ToString(), new Font("Arial", 8), Brushes.Black, new PointF(0, 0));
        }
      }
    }
    public void DrawImageRect4FloatAttribAbortData(PaintEventArgs e) {}
  }
}

出力:

画像 - コアラの元画像と編集画像

他のオーバーロードされた DrawImage() メソッドに関する詳細な議論は、[このリファレンス] で利用できます。

Abdullahi Salawudeen avatar Abdullahi Salawudeen avatar

Abdullahi is a full-stack developer and technical writer with over 5 years of experience designing and implementing enterprise applications. He loves taking on new challenges and believes conceptual programming theories should be implemented in reality.

LinkedIn GitHub

関連記事 - Csharp Image