小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C#屏幕截取包括窗口

 紫衣風(fēng)華 2014-11-01

截取桌面圖像,比較簡單,只需要簡單的調(diào)用Graphics的CopyFromScreen方法即可以實(shí)現(xiàn);

 

    關(guān)于將圖像繪制到窗口上很容易實(shí)現(xiàn),但是卻很少看到有文章介紹從窗口上截取圖像的。下面主要介紹一下關(guān)于窗口圖像截取的方法。

    要截取窗口的圖像,需要用到系統(tǒng)提供的BitBlt函數(shù),這個(gè)函數(shù)的作用就是從源設(shè)備的上下文中拷貝一張Bitmap圖像至目標(biāo)設(shè)備。具體參數(shù)介紹請參見MSDN文檔

   下面是C#對該函數(shù)的引入操作:

  

   [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
   public static extern int BitBlt(HandleRef hDC, int x, int y, int nWidth, int nHeight, HandleRef hSrcDC, int xSrc, int ySrc, int dwRop);

 

   具體操作代碼參見如下:

            Graphics gSrc = this.CreateGraphics();     //創(chuàng)建窗體的Graphics對象
            HandleRef hDcSrc = new HandleRef(null, gSrc.GetHdc());

            int width = this.Width-SystemInformation.FrameBorderSize.Width;     //獲取寬度
            int height = this.Height-SystemInformation.FrameBorderSize.Height;     //獲取高度

            const int SRCCOPY = 0xcc0020;     //復(fù)制圖塊的光柵操作碼

            Bitmap bmSave = new Bitmap(width, height);     //用于保存圖片的位圖對象
            Graphics gSave = Graphics.FromImage(bmSave);     //創(chuàng)建該位圖的Graphics對象
            HandleRef hDcSave = new HandleRef(null, gSave.GetHdc());     //得到句柄

            BitBlt(hDcSave, 0, 0, width, height, hDcSrc, 0, 0, SRCCOPY);

    如此操作,當(dāng)前窗體的圖像即被保存之bmSave中。

 

下面提供一段詳細(xì)的代碼

 

[c-sharp] view plaincopy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Text;  
  7. using System.Windows.Forms;  
  8. using System.Runtime.InteropServices;  
  9.   
  10. namespace ScreenShot  
  11. {  
  12.     public partial class Form1 : Form  
  13.     {  
  14.         public Form1()  
  15.         {  
  16.             InitializeComponent();  
  17.         }  
  18.   
  19.         private void btnScreen_Click(object sender, EventArgs e)  
  20.         {  
  21.             int screenWidth = System.Windows.Forms.SystemInformation.VirtualScreen.Width;     //屏幕寬度  
  22.             int screenHeight = System.Windows.Forms.SystemInformation.VirtualScreen.Height;     //屏幕高度  
  23.   
  24.             Bitmap bmSave = new Bitmap(screenWidth, screenHeight);  
  25.             Graphics g = Graphics.FromImage(bmSave);  
  26.   
  27.             g.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight), CopyPixelOperation.SourceCopy);  
  28.             g.Dispose();  
  29.   
  30.             SaveFile(bmSave);  
  31.         }  
  32.   
  33.         private void btnWindow_Click(object sender, EventArgs e)  
  34.         {  
  35.             Graphics gSrc = this.CreateGraphics();     //創(chuàng)建窗體的Graphics對象  
  36.             HandleRef hDcSrc = new HandleRef(null, gSrc.GetHdc());  
  37.   
  38.             int width = this.Width-SystemInformation.FrameBorderSize.Width;     //獲取寬度  
  39.             int height = this.Height-SystemInformation.FrameBorderSize.Height;     //獲取高度  
  40.   
  41.             const int SRCCOPY = 0xcc0020;     //復(fù)制圖塊的光柵操作碼  
  42.   
  43.             Bitmap bmSave = new Bitmap(width, height);     //用于保存圖片的位圖對象  
  44.             Graphics gSave = Graphics.FromImage(bmSave);     //創(chuàng)建該位圖的Graphics對象  
  45.             HandleRef hDcSave = new HandleRef(null, gSave.GetHdc());     //得到句柄  
  46.   
  47.             BitBlt(hDcSave, 0, 0, width, height, hDcSrc, 0, 0, SRCCOPY);  
  48.   
  49.             gSrc.ReleaseHdc();  
  50.             gSave.ReleaseHdc();  
  51.   
  52.             gSrc.Dispose();  
  53.             gSave.Dispose();  
  54.   
  55.             SaveFile(bmSave);  
  56.         }  
  57.         private void SaveFile(Bitmap bmSave)  
  58.         {  
  59.             if (DialogResult.OK == saveFileDialog1.ShowDialog())  
  60.             {  
  61.                 string fileName = saveFileDialog1.FileName;  
  62.                 if (1 == saveFileDialog1.FilterIndex)  
  63.                 {  
  64.                     if (!fileName.EndsWith(".bmp"))  
  65.                     {  
  66.                         fileName += ".bmp";  
  67.                     }  
  68.                 }  
  69.                 else if (2 == saveFileDialog1.FilterIndex)  
  70.                 {  
  71.                     if (!fileName.EndsWith(".jpg"))  
  72.                     {  
  73.                         fileName += ".jpg";  
  74.                     }  
  75.                 }  
  76.                 else if (3 == saveFileDialog1.FilterIndex)  
  77.                 {  
  78.                     if (!fileName.EndsWith(".png"))  
  79.                     {  
  80.                         fileName += ".png";  
  81.                     }  
  82.                 }  
  83.                 Save(bmSave, fileName);  
  84.             }  
  85.         }  
  86.         private void Save(Bitmap bm,string fileName)  
  87.         {  
  88.             if (fileName.EndsWith(".bmp"))  
  89.             {  
  90.                 bm.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp);  
  91.             }  
  92.             else if (fileName.EndsWith(".jpg"))  
  93.             {  
  94.                 bm.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);  
  95.             }  
  96.             else if (fileName.EndsWith(".png"))  
  97.             {  
  98.                 bm.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);  
  99.             }  
  100.             bm.Dispose();  
  101.         }  
  102.   
  103.         [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]  
  104.         public static extern int BitBlt(HandleRef hDC, int x, int y, int nWidth, int nHeight, HandleRef hSrcDC, int xSrc, int ySrc, int dwRop);  
  105.     }  
  106. }   

 

窗體設(shè)計(jì)部分代碼就省略了,測試窗體圖像如下:

 


    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多