C\#전체 화면 캡 처 해결 방법

오늘 한 동료 가 전체 화면 캡 처 코드 를 쓰 려 고 합 니 다.당연히 구현 해 야 할 첫 번 째 단 계 는 전체 화면의 비트 맵 을 가 져 올 수 있 고 Win 32 API 의 CreateDC,BitBlt 등 함수 가 사용 할 수 있 음 을 기억 하 는 것 이다.그래서 인터넷 에서 찾 아 보 니 과연 화면 캡 처 는 이 함수 들 을 사용 했다.그러나 winform 은 API 를 모두 잊 어 버 릴 수 있 기 때문에 Win 32 API 가 없 는 실현 방식 을 찾 아야 합 니 다.인터넷 의 실현 과 자신의 디자인 을 종합 하여 실현 방향 은 다음 과 같다.1.캡 처 를 시작 할 때 화면 크기 와 같은 비트 맵 을 만 든 다음 에 Graphics.CopyFromScreen()으로 화면 비트 맵 을 이 비트 맵 에 복사 한다.이것 은 매우 중요 한 단계 입 니 다.그러면 모든 조작 이 이 비트 맵 에서 이 루어 질 수 있 고 실제 화면 과 무관 합 니 다. 

Code
int width = Screen.PrimaryScreen.Bounds.Width;
int height = Screen.PrimaryScreen.Bounds.Height;
Bitmap bmp = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(bmp)) {
    g.CopyFromScreen(0, 0, 0, 0, new Size(width, height));
}
2.그 다음 에 이 위 에서 캡 처 하 는 것 을 편리 하 게 하기 위해 중요 한 디자인 실현 방식 이 있 습 니 다.기 존의 실제 화면 대신 전체 화면 창 을 사용 하면 캡 처 과정의 모든 작업 을 그 창 에서 실현 할 수 있 습 니 다.(이 창 은 경계선 이 없고 높이 는 화면 크기 와 같 으 면 됩 니 다)또한 엄폐 효과(선택 한 일부 화면 내용 만 정상적으로 표시 할 수 있 으 며,실제 부분 은 반투명 층 으로 덮어 쓰기)를 표시 하기 위해 반투명 위치 비트 맵 을 추가 합 니 다.구체 적 인 코드 는 다음 과 같다.

Code
public partial class FullScreenForm : Form {
    private Rectangle rectSelected = Rectangle.Empty;
    private bool isClipping = false;
    private Bitmap screen;
    private Bitmap coverLayer = null;
    private Color coverColor;
    private Brush rectBrush = null;
    private Bitmap resultBmp = null;
    public FullScreenForm(Bitmap screen) {
        InitializeComponent();
        int width = Screen.PrimaryScreen.Bounds.Width;
        int height = Screen.PrimaryScreen.Bounds.Height;
        coverLayer = new Bitmap(width, height);
        coverColor = Color.FromArgb(50, 200, 0, 0);
        rectBrush = new SolidBrush(coverColor);
        using (Graphics g = Graphics.FromImage(coverLayer)) {
            g.Clear(coverColor);
        }
        this.Bounds = new Rectangle(0, 0, width, height);
        this.screen = screen;
        this.DoubleBuffered = true;
    }
    protected override void OnMouseDown(MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) {
            isClipping = true;
            rectSelected.Location = e.Location;
        }
        else if (e.Button == MouseButtons.Right) {
            this.DialogResult = DialogResult.OK;
        }
    }
    protected override void OnMouseMove(MouseEventArgs e) {
        if (e.Button == MouseButtons.Left && isClipping) {
            rectSelected.Width = e.X - rectSelected.X;
            rectSelected.Height = e.Y - rectSelected.Y;

            this.Invalidate();
        }
    }
    protected override void OnMouseUp(MouseEventArgs e) {
        if (e.Button == MouseButtons.Left && isClipping) {
            rectSelected.Width = e.X - rectSelected.X;
            rectSelected.Height = e.Y - rectSelected.Y;
            this.Invalidate();
            resultBmp = new Bitmap(rectSelected.Width, rectSelected.Height);
            using (Graphics g = Graphics.FromImage(resultBmp)) {
                g.DrawImage(screen,new Rectangle(0, 0, rectSelected.Width, rectSelected.Height), rectSelected, GraphicsUnit.Pixel);
            }
            this.DialogResult = DialogResult.OK;
        }
    }
    protected override void OnPaint(PaintEventArgs e) {
        Graphics g = e.Graphics;
        g.DrawImage(screen, 0, 0);
        g.DrawImage(coverLayer, 0, 0);
        PaintRectangle();
    }
    protected override void OnPaintBackground(PaintEventArgs e) {

    }
    protected override void OnKeyDown(KeyEventArgs e) {
        if (e.KeyCode == Keys.Escape) {
            this.DialogResult = DialogResult.Cancel;
        }
    }
    private void PaintRectangle() {
        using (Graphics g = Graphics.FromImage(coverLayer)) {
            g.Clear(coverColor);
            GraphicsPath path = new GraphicsPath();
            path.AddRectangle(this.Bounds);
            path.AddRectangle(rectSelected);
            g.FillPath(rectBrush, path);
            g.DrawRectangle(Pens.Blue, rectSelected);
        }
    }
    public Bitmap ResultBitmap {
        get { return resultBmp; }
    }
}
위의 코드 는 모두 쉽게 알 수 있다.여기 에는 Graphics Path 가 있 는데 이것 은 자동 으로 중 공 구역 을 형성 할 수 있다.위의 실현 은 쉽게 확장 된다.다 구역 캡 처,다 심판 캡 처 등 이 모두 쉽게 이 루어 진다.

좋은 웹페이지 즐겨찾기