C#으로 화면 캡처하는 방법

화면 캡처 기능은 프로그램에서 생각보다 자주 쓰입니다. 디버깅용 도구를 만들거나, 자동으로 스크린샷을 저장하는 프로그램을 구현할 때 특히 유용하죠. C#에서는 복잡한 라이브러리 없이도 간단하게 화면을 캡처할 수 있는 방법이 있답니다.

기본적인 화면 캡처 방법

화면을 캡처하는 핵심은 바로 Graphics 클래스와 Bitmap 객체예요. 간단히 말하면, Bitmap은 이미지를 담는 '그릇'이고, Graphics는 '그림을 그리는 도구'라고 생각하면 돼요. 둘을 조합하면 현재 화면을 그대로 가져오는 게 가능해요.

여기 코드 한 번 볼까요?

// 화면 캡처 메서드
private Bitmap CaptureScreen()
{
    // 화면 크기만큼 비트맵 생성
    Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);

    // Graphics로 화면 내용을 비트맵에 복사
    using (Graphics g = Graphics.FromImage(bmp))
    {
        g.CopyFromScreen(0, 0, 0, 0, bmp.Size); // 좌표 (0, 0)부터 전체 화면을 캡처
    }

    return bmp; // 캡처된 이미지를 반환
}

이 코드는 정말 직관적이에요. 주요 내용을 살펴보자면

  1. Bitmap 생성
    먼저 Screen.PrimaryScreen.Bounds를 사용해서 현재 모니터의 해상도를 가져와요. 이걸 바탕으로 캡처 결과를 담을 크기의 Bitmap을 만들어요.
  2. Graphics와 CopyFromScreen
    Graphics.FromImage로 비트맵에 그림을 그릴 준비를 해요. 그리고 CopyFromScreen으로 화면 내용을 복사합니다. 여기서 (0, 0)은 화면 좌표의 시작점이에요. 필요한 영역만 캡처하고 싶다면 이 값을 조정하면 돼요.
  3. 리소스 정리
    Graphics 객체는 메모리 관리를 위해 using 블록으로 감싸는 게 좋아요. 그래야 코드가 깔끔하고, 자원을 낭비하지 않거든요!

캡처한 이미지 저장해 보기

이제 캡처한 화면을 파일로 저장해 보죠. 저장은 정말 간단해요. 이미지를 파일에 넣어줄 뿐이니까요~

// 캡처 이미지를 저장하는 메서드
private void SaveCaptureToFile()
{
    Bitmap capturedImage = CaptureScreen(); // 화면 캡처 실행
    string filePath = @"C:\temp\captured_image.png"; // 저장 경로 지정

    // PNG 형식으로 이미지 저장
    capturedImage.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);

    Console.WriteLine("이미지가 저장되었습니다: " + filePath);
}

이 메서드는 캡처한 이미지를 PNG 형식으로 저장해요. 물론 다른 형식도 지원되니 필요에 맞게 바꾸면 됩니다.

화면 캡처를 쓸 때 알아두면 좋은 점

  • 다중 모니터 지원
    만약 여러 대의 모니터를 쓰고 있다면, Screen.AllScreens를 활용해 각각의 모니터를 캡처하는 방식으로 확장할 수 있어요.
  • 특정 영역 캡처
    전체 화면이 아니라 특정 영역만 캡처하고 싶다면 CopyFromScreen 메서드의 좌표와 크기를 조정하면 돼요. 예를 들어, (100, 100, 0, 0, new Size(200, 200))처럼 쓰면 (100, 100)에서 시작해 가로 세로 200픽셀만 캡처하게 됩니다.

참고자료 비트맨에서 MAT으로

    private static Mat BitmapToMat(Bitmap bitmap)
    {
        BitmapData bitmapData = bitmap.LockBits(
            new Rectangle(0, 0, bitmap.Width, bitmap.Height),
            ImageLockMode.ReadOnly,
            PixelFormat.Format24bppRgb);

        Mat mat = new Mat(bitmap.Height, bitmap.Width, MatType.CV_8UC3);

        unsafe
        {
            byte* srcPtr = (byte*)bitmapData.Scan0;
            byte* dstPtr = (byte*)mat.DataPointer;

            for (int y = 0; y < bitmap.Height; y++)
            {
                Buffer.MemoryCopy(
                    srcPtr + y * bitmapData.Stride,
                    dstPtr + y * mat.Step(),
                    mat.Cols * mat.ElemSize(),
                    mat.Cols * mat.ElemSize());
            }
        }

        bitmap.UnlockBits(bitmapData);
        return mat;
    }
이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗