ScreenCapture.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*----------------------------------------------------------------
  2. // Copyright (C) 2007 liu523@QQ.COM
  3. // 版权所有。
  4. // 开发者:liu523@QQ.COM团队
  5. // 文件名:ScreenCapture.cs
  6. // 文件功能描述:屏幕捕获(带有压缩)。
  7. //----------------------------------------------------------------*/
  8. using System;
  9. using System.Text;
  10. using System.Drawing.Imaging;
  11. using System.IO;
  12. using System.Drawing;
  13. using System.Windows.Forms;
  14. namespace NetworkRemoteControlLib.Windows
  15. {
  16. /// <summary>
  17. /// 屏幕捕获类
  18. /// </summary>
  19. public class ScreenCapture
  20. {
  21. /// <summary>
  22. /// 把当前屏幕捕获到位图对象中
  23. /// </summary>
  24. /// <param name="hdcDest">目标设备的句柄</param>
  25. /// <param name="nXDest">目标对象的左上角的X坐标</param>
  26. /// <param name="nYDest">目标对象的左上角的X坐标</param>
  27. /// <param name="nWidth">目标对象的矩形的宽度</param>
  28. /// <param name="nHeight">目标对象的矩形的长度</param>
  29. /// <param name="hdcSrc">源设备的句柄</param>
  30. /// <param name="nXSrc">源对象的左上角的X坐标</param>
  31. /// <param name="nYSrc">源对象的左上角的X坐标</param>
  32. /// <param name="dwRop">光栅的操作值</param>
  33. /// <returns></returns>
  34. [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
  35. private static extern bool BitBlt(
  36. IntPtr hdcDest,
  37. int nXDest,
  38. int nYDest,
  39. int nWidth,
  40. int nHeight,
  41. IntPtr hdcSrc,
  42. int nXSrc,
  43. int nYSrc,
  44. int dwRop
  45. );
  46. [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
  47. private static extern IntPtr CreateDC(
  48. string lpszDriver, // 驱动名称
  49. string lpszDevice, // 设备名称
  50. string lpszOutput, // 无用,可以设定位"NULL"
  51. IntPtr lpInitData // 任意的打印机数据
  52. );
  53. /// <summary>
  54. /// 屏幕捕获到位图对象中
  55. /// </summary>
  56. /// <returns></returns>
  57. public static Image Capture()
  58. {
  59. //创建显示器的DC
  60. IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
  61. //由一个指定设备的句柄创建一个新的Graphics对象
  62. Graphics g1 = Graphics.FromHdc(dc1);
  63. //根据屏幕大小创建一个与之相同大小的Bitmap对象
  64. Bitmap ScreenImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
  65. Graphics g2 = Graphics.FromImage(ScreenImage);
  66. //获得屏幕的句柄
  67. IntPtr dc3 = g1.GetHdc();
  68. //获得位图的句柄
  69. IntPtr dc2 = g2.GetHdc();
  70. //把当前屏幕捕获到位图对象中
  71. BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);
  72. //释放屏幕句柄
  73. g1.ReleaseHdc(dc3);
  74. //释放位图句柄
  75. g2.ReleaseHdc(dc2);
  76. //压缩图片
  77. Image bmp = MakeThumbnail(ScreenImage, ScreenImage.Width * 3 / 4, ScreenImage.Height * 3 / 4);
  78. //ScreenImage.SetResolution(800,600);
  79. return bmp;
  80. }
  81. /// <summary>
  82. /// 压缩图片
  83. /// </summary>
  84. /// <param name="originalImage"></param>
  85. public static Image MakeThumbnail(Image originalImage, int towidth,int toheight)
  86. {
  87. int x = 0;
  88. int y = 0;
  89. int ow = originalImage.Width;
  90. int oh = originalImage.Height;
  91. //新建一个bmp图片
  92. System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
  93. //新建一个画板
  94. System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
  95. //设置高质量插值法
  96. g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
  97. //设置低质量,高速度呈现平滑程度
  98. g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
  99. //清空画布并以透明背景色填充
  100. g.Clear(System.Drawing.Color.Transparent);
  101. //在指定位置并且按指定大小绘制原图片的指定部分
  102. g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel);
  103. return bitmap;
  104. }
  105. }
  106. }