C#에서 이미지 자르기
- 
          
            Graphics.DrawImage()메서드를 사용하여C#에서 이미지 그리기 및 자르기
- 
          
            5개의 매개변수와 함께 DrawImage()를 사용하여C#에서 이미지 자르기
- 
          
            DrawImage()를 지정된 부분, 위치 및 크기와 함께 사용하여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 이벤트 핸들러를 사용하여 구현됩니다.
다음은 수행된 열거된 작업입니다.
- C:\Users\lolaa\Downloads폴더에 있는- Koala.jpgJPEG 파일에서 이미지가 생성되었습니다.
- 이미지를 그릴 좌표가 생성되었습니다.
- 이미지의 일부를 추출하기 위해 소스 사각형이 생성되었습니다.
- 측정 단위는 픽셀로 설정되었습니다.
- 이미지가 화면에 그려졌습니다.
지정된 소스 사각형 크기에 따라 화면에 그려지는 크기 조정되지 않은 원래 이미지의 부분이 결정됩니다.
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();
      }
    }
  }
}
출력:

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- 화면에서 이미지의 위치와 크기를 지정합니다. 사각형에 맞게 그려진 이미지의 크기를 조정합니다.
- srcX및- srcY- 이미지 왼쪽 위 모서리의 x 및 y 좌표입니다.
- srcWidth및- srcHeight- 각각 이미지의 너비와 높이를 지정합니다.
- srcUnit-- GraphicsUnit열거에 속합니다.- srcRect매개변수에서 사용하는 측정 단위입니다.
- imageAttrs- 이미지 개체에 대한 다시 칠하기 및 감마 정보를 지정하는- ImageAttributes인스턴스입니다.
- 콜백-- Graphics.DrawImageAbort의 대리 함수입니다. 이미지를 그릴 때 호출할- DrawImage()오버로드를 지정합니다. 응용 프로그램의 사양에 따라 이 메서드가 호출되는 횟수가 결정됩니다.
- callbackData-- DrawImage메서드의 실행을 중지할지 여부를 확인할 때 사용할- Graphics.DrawImageAbort대리자에 대한 추가 데이터를 지정하는 값입니다.
아래 코드의 예 역시 Windows Forms와 PaintEventArgs e를 매개변수로 하는 Paint 이벤트 핸들러를 사용하여 구현되었습니다.
코드는 다음 작업을 수행합니다.
- Graphics.DrawImageAbort콜백 메서드의 인스턴스가 생성되었습니다.
- C:\Users\lolaa\Downloads폴더에- Koala.jpg이미지가 생성되었습니다.
- 이미지를 그릴 대상 사각형에 대한 점이 생성되었습니다.
- 그릴 이미지 부분을 지정하기 위해 직사각형 컨테이너가 생성되었습니다.
- 그래픽 그리기 단위가 픽셀로 설정되었습니다.
- 원본 이미지가 화면에 그려졌습니다.
- 조정된 이미지를 그리는 추가 사각형 컨테이너.
- 조정된 이미지의 속성을 더 큰 감마 값으로 설정합니다.
- 조정된 이미지가 화면에 그려졌습니다.
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() 메서드에 대한 자세한 내용은 [이 참조]에서 확인할 수 있습니다.
