a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

解決C#全屏幕截圖的實現方法

2020-01-24 03:17:22
字體:
來源:轉載
供稿:網友
今天一位同事想寫一個全屏幕截圖的代碼。當然要實現的第一步是能夠獲取整個屏幕的位圖,記得Win32 API的CreateDC, BitBlt等函數可以使用。于是上網查了下,果然屏幕截圖用這些函數。但winform已經可以把API都忘記了,所以得尋找一個無Win32 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; }
    }
}

上面的代碼都很容易看明白,這里有一個技巧就是GraphicsPath,它自動會形成一個中空的區域。上面的實現很容易擴展:多區域截圖,多裁判截圖等都很容易實現。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中文字幕日韩一区二区不卡 | 国产成人激情 | 日本在线观看视频网站 | 久久久久久精 | 中文字幕亚洲在线观看 | 欧美日韩激情在线 | 性国产xxxx乳高跟 | 日韩在线二区 | 中文字幕第二十六页页 | 色天天综合 | 国产欧美精品 | 亚洲国产精品99久久久久久久久 | 日韩亚洲精品视频 | 九一视频在线免费观看 | 久久精品视频网站 | 国产一区二区三区四区三区 | 黄视频网站免费观看 | 91污片| 在线观看av片 | 激情久久av一区av二区av三区 | 国产成人影院在线观看 | 中文字幕视频在线免费观看 | 大黄网站在线观看 | 色婷婷在线视频 | 超碰人人精品 | 亚洲成人三级 | 播放一区 | 日韩91 | 久久久久av | 亚洲免费在线观看 | 国产一区二区三区久久99 | 精品欧美一区二区三区 | 亚洲精品免费在线播放 | 一级片免费观看 | www.青青草 | 青草福利 | 欧美午夜精品久久久久久浪潮 | 精品在线一区二区 | 久久一二区 | 国产精品久久久久永久免费观看 | 精品久久久久久久久久久久久久 |