c# 根据窗口截图,合并图片

  1. public class CaptureWindows
  2. {
  3. #region 类
  4. /// <summary>
  5. /// Helper class containing User32 API functions
  6. /// </summary>
  7. private class User32
  8. {
  9. [StructLayout(LayoutKind.Sequential)]
  10. public struct RECT
  11. {
  12. public int left;
  13. public int top;
  14. public int right;
  15. public int bottom;
  16. }
  17. [DllImport("user32.dll")]
  18. public static extern IntPtr GetDesktopWindow();
  19. [DllImport("user32.dll")]
  20. public static extern IntPtr GetWindowDC(IntPtr hWnd);
  21. [DllImport("user32.dll")]
  22. public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
  23. [DllImport("user32.dll")]
  24. public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);
  25. }
  26.  
  27. private class GDI32
  28. {
  29.  
  30. public const int SRCCOPY = 0x00CC0020; // BitBlt dwRop parameter
  31. [DllImport("gdi32.dll")]
  32. public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest,
  33. int nWidth, int nHeight, IntPtr hObjectSource,
  34. int nXSrc, int nYSrc, int dwRop);
  35. [DllImport("gdi32.dll")]
  36. public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth,
  37. int nHeight);
  38. [DllImport("gdi32.dll")]
  39. public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
  40. [DllImport("gdi32.dll")]
  41. public static extern bool DeleteDC(IntPtr hDC);
  42. [DllImport("gdi32.dll")]
  43. public static extern bool DeleteObject(IntPtr hObject);
  44. [DllImport("gdi32.dll")]
  45. public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
  46. }
  47. #endregion
  48.  
  49. [DllImport("user32.dll", EntryPoint = "FindWindow")]
  50. public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  51.  
  52. /// <summary>
  53. /// 根据句柄名截图
  54. /// </summary>
  55. /// <param name="handle">句柄名</param>
  56. /// <returns></returns>
  57. public Image CaptureWindow(IntPtr handle)
  58. {
  59. // get te hDC of the target window
  60. IntPtr hdcSrc = User32.GetWindowDC(handle);
  61. // get the size
  62. User32.RECT windowRect = new User32.RECT();
  63. User32.GetWindowRect(handle, ref windowRect);
  64. int width = windowRect.right - windowRect.left;
  65. int height = windowRect.bottom - windowRect.top;
  66. // create a device context we can copy to
  67. IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
  68. // create a bitmap we can copy it to,
  69. // using GetDeviceCaps to get the width/height
  70. IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
  71. // select the bitmap object
  72. IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
  73. // bitblt over
  74. GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
  75. // restore selection
  76. GDI32.SelectObject(hdcDest, hOld);
  77. // clean up
  78. GDI32.DeleteDC(hdcDest);
  79. User32.ReleaseDC(handle, hdcSrc);
  80. // get a .NET image object for it
  81. Image img = Image.FromHbitmap(hBitmap);
  82. // free up the Bitmap object
  83. GDI32.DeleteObject(hBitmap);
  84. return img;
  85. }
  86.  
  87. /// <summary>
  88. /// 根据窗口名称截图
  89. /// </summary>
  90. /// <param name="windowName">窗口名称</param>
  91. /// <returns></returns>
  92. public Image CaptureWindow(string windowName)
  93. {
  94. IntPtr handle = FindWindow(null, windowName);
  95. IntPtr hdcSrc = User32.GetWindowDC(handle);
  96. User32.RECT windowRect = new User32.RECT();
  97. User32.GetWindowRect(handle, ref windowRect);
  98. int width = windowRect.right - windowRect.left;
  99. int height = windowRect.bottom - windowRect.top;
  100. IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
  101. IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
  102. IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
  103. GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
  104. GDI32.SelectObject(hdcDest, hOld);
  105. GDI32.DeleteDC(hdcDest);
  106. User32.ReleaseDC(handle, hdcSrc);
  107. Image img = Image.FromHbitmap(hBitmap);
  108. GDI32.DeleteObject(hBitmap);
  109. return img;
  110. }
  111. /// <summary>
  112. /// 合并图片
  113. /// </summary>
  114. /// <param name="firstImage">第一张图片</param>
  115. /// <param name="lastImage">第二张图片</param>
  116. /// <returns></returns>
  117. public Image MergerImage(Image firstImage, Image lastImage)
  118. {
  119. int width = firstImage.Width + lastImage.Width ;
  120. int height = firstImage.Height > lastImage.Height ? firstImage.Height : lastImage.Height;
  121. ////创建要显示的图片对象,根据参数的个数设置宽度
  122. Bitmap backgroudImg = new Bitmap(width, height);
  123. Graphics g = Graphics.FromImage(backgroudImg);
  124. ////清除画布,背景设置为白色
  125. g.Clear(System.Drawing.Color.White);
  126. g.DrawImageUnscaled(firstImage, 0, 0);
  127. g.DrawImageUnscaled(lastImage, firstImage.Width, 0);
  128. g.Dispose();
  129. return backgroudImg;
  130. }
  131.  
  132. }

  

c# 根据窗口截图,合并图片的更多相关文章

  1. Ocr答题辅助神器 OcrAnswerer4.x,通过百度OCR识别手机文字,支持屏幕窗口截图和ADB安卓截图,支持四十个直播App,可保存题库

    http://www.cnblogs.com/Charltsing/p/OcrAnswerer.html 联系qq:564955427 最新版为v4.1版,开放一定概率的八窗口体验功能,请截图体验(多 ...

  2. C# 非顶端窗口截图 - 用于查找指定窗口并截图

    原文地址:http://blog.csdn.net/u013096568/article/details/53400389 panel上可以通过DrawToBitmap截图,不管是否在屏幕外是否有遮挡 ...

  3. Python+selenium之窗口截图

    自动化用例是由程序去执行,因此有时候打印的错误信息并不明确,如果在脚本执行错误的时候能对当前窗口截图保存,那么通过图片就可以非常直观的看出出错的原因.webdriver提供了截图函数get_scree ...

  4. Selenium常用API的使用java语言之20-获取窗口截图

    自动化用例是由程序去执行,因此有时候打印的错误信息并不十分明确.如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因. WebDriver提供了截图函数getScr ...

  5. Selenium 2自动化测试实战23(窗口截图)

    一.窗口截图 WebDriver提供了截图函数get_screenshot_as_file()来截取当前窗口. # -*- coding: utf-8 -*- from selenium import ...

  6. Selenium3 + Python3自动化测试系列十二——窗口截图与关闭浏览器

    窗口截图 自动化用例是由程序去执行的,因此有时候打印的错误信息并不十分明确.如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因.WebDriver提供了截图函数g ...

  7. selenium窗口截图操作

    selenium窗口截图操作 使用背景:在自动化测试过程中,可能遇到执行错误情况,那么怎么样及时捕获出错信息/界面? 可以使用  get_screenshot_as_file(self,filenam ...

  8. Selenium实战(三)——滑动解锁+窗口截图

    一.简单滑块的实例 当单机滑块时,改变的只是CSS样式,HTML代码如下: <div class="slide-to-unlock-progress" style=" ...

  9. 【Selenium04篇】python+selenium实现Web自动化:文件上传,Cookie操作,调用 JavaScript,窗口截图

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第四篇博 ...

随机推荐

  1. iis配置出现的问题及解决

    唯一密钥属性“value”设置…无法添加类型为add 在配置IIS7.5时,会出现 在唯一密钥属性“value”设置为“default.aspx”(或者index.asp等)时,无法添加类型为“add ...

  2. ADB命令与monkey

    adb devices查看已连接的设备 adb install package.apk adb shell monkey 1000 随机操作1000次当次操作可能会 adb无法使用,提示error: ...

  3. ArcGIS Server 9.3 安装(win7).

    概述: 安装的过程还不算复杂,但是有个地方需要注意:就是防火墙.需要将 "本机的防火墙" 关掉, 并将 "杀毒软件关闭"(360和avira都会乱来,搞得我安了 ...

  4. JCo 指南

    http://blog.csdn.net/asdfak/article/details/5834731 JAVA 调用SAP端接口 Java Connector and BAPI 前些日子想去深入的研 ...

  5. channel c3 disabled, job failed on it will be run on another channel

    今天执行备份时,报错: allocated channel: c3 channel c3: sid=131 instance=orcl2 devtype=DISK   RMAN-03009: fail ...

  6. [c#]控制台进度条的示例

    看到[vb.net]控制台进度条的示例 感觉很好玩,翻译成C#版. using System; using System.Collections.Generic; using System.Linq; ...

  7. php+js 瀑布流源码

    官方网站:更多源码 新浪微博:QQ公众号 QQ:各种源码 602902342 大牛技术群: 452207697 下载地址:http://pan.baidu.com/s/1bnNipI3 密码: h93 ...

  8. jquery1.9学习笔记 之层级选择器(三)

    下一个相邻选择器(“prev + next”) 描述:选择所有给出祖先选择器的子孙选择器. 例子: <!doctype html> <html lang='zh'> <h ...

  9. (转载)C# 编程 使用可空类型

    转载出处为://https://msdn.microsoft.com/zh-cn/library/2cf62fcy(vs.90).aspx#Anchor_1 C#可以为 null 的类型可以表示基础类 ...

  10. 第一个微信小程序(实现点击一个按钮弹出toast)

    今天根据网上的教程搭建了微信小程序的环境,然后看文档做了一个简单的小应用. 项目的目录是这个样子的: app.js.app.json.app.wxss是全局文件,必不可少的文件.定义在app.wxss ...