C#에서 이미지 자르기

Abdullahi Salawudeen 2023년10월12일
  1. Graphics.DrawImage() 메서드를 사용하여 C#에서 이미지 그리기 및 자르기
  2. 5개의 매개변수와 함께 DrawImage()를 사용하여 C#에서 이미지 자르기
  3. DrawImage()를 지정된 부분, 위치 및 크기와 함께 사용하여 C#에서 이미지 자르기
C#에서 이미지 자르기

이 글에서는 C# 코드를 사용하여 특정 이미지를 지정된 위치에 원본 크기로 그리고 자르는 방법을 소개합니다.

Graphics.DrawImage() 메서드를 사용하여 C#에서 이미지 그리기 및 자르기

그래픽은 System.Drawing 네임스페이스에서 찾을 수 있으며 주로 .Net 기반 Windows 응용 프로그램에서 그래픽 또는 이미지를 표시하거나 그리는 데 사용됩니다. .Net은 펜, 브러시, 사각형, 원 등과 같은 그래픽 개체 및 모양을 처리하는 여러 클래스를 제공합니다.

그래픽 및 이미지 .Net 클래스는 Windows Form에서 이미지를 렌더링할 수 있습니다. DrawImage() 함수는 지정된 위치에 이미지의 일부를 그립니다.

다음은 DrawImage 기능에 대한 코드 스니펫입니다.

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

매개변수는 아래에 설명되어 있습니다.

  • 이미지 - 그릴 이미지를 지정합니다.
  • x - 이미지의 x 좌표를 지정합니다.
  • y - 이미지의 y 좌표를 지정합니다.
  • srcRect - 그릴 이미지 부분을 지정하는 RectangleF 구조입니다.
  • srcUnit - srcRect에서 사용하는 측정 단위를 지정하는 GraphicsUnit 열거형의 멤버입니다.

다음 코드 예제는 PaintEventArgs e를 매개 변수로 사용하여 Windows Forms 및 Paint 이벤트 핸들러를 사용하여 구현됩니다.

다음은 수행된 열거된 작업입니다.

  1. C:\Users\lolaa\Downloads 폴더에 있는 Koala.jpg JPEG 파일에서 이미지가 생성되었습니다.
  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);
}

5개의 매개변수와 함께 DrawImage()를 사용하여 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();
      }
    }
  }
}

출력:

Image - 자른 코알라 이미지

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

위의 코드를 업데이트하면 다른 출력이 제공됩니다. 아래는 업데이트된 코드 예제입니다.

매개변수는 아래에 설명되어 있습니다.

  • 이미지 - 그릴 이미지를 지정합니다.
  • destRect - 화면에서 이미지의 위치와 크기를 지정합니다. 사각형에 맞게 그려진 이미지의 크기를 조정합니다.
  • srcXsrcY - 이미지 왼쪽 위 모서리의 x 및 y 좌표입니다.
  • srcWidthsrcHeight - 각각 이미지의 너비와 높이를 지정합니다.
  • srcUnit - GraphicsUnit 열거에 속합니다. srcRect 매개변수에서 사용하는 측정 단위입니다.
  • imageAttrs - 이미지 개체에 대한 다시 칠하기 및 감마 정보를 지정하는 ImageAttributes 인스턴스입니다.
  • 콜백 - Graphics.DrawImageAbort의 대리 함수입니다. 이미지를 그릴 때 호출할 DrawImage() 오버로드를 지정합니다. 응용 프로그램의 사양에 따라 이 메서드가 호출되는 횟수가 결정됩니다.
  • callbackData - DrawImage 메서드의 실행을 중지할지 여부를 확인할 때 사용할 Graphics.DrawImageAbort 대리자에 대한 추가 데이터를 지정하는 값입니다.

아래 코드의 예 역시 Windows Forms와 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