python调用win32接口进行截图的示例


Posted in Python onNovember 11, 2020

python的版本及依赖的库的安装

#版本python 3.7.1
pip install pywin32==224
pip install numpy==1.15.3
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16
pip install Pillow-PIL==0.1.dev0

对后台窗口截图

#对后台窗口截图
import win32gui, win32ui, win32con
from ctypes import windll
from PIL import Image
import cv2
import numpy
 
#获取后台窗口的句柄,注意后台窗口不能最小化
hWnd = win32gui.FindWindow("NotePad",None) #窗口的类名可以用Visual Studio的SPY++工具获取
#获取句柄窗口的大小信息
left, top, right, bot = win32gui.GetWindowRect(hWnd)
width = right - left
height = bot - top
#返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框
hWndDC = win32gui.GetWindowDC(hWnd)
#创建设备描述表
mfcDC = win32ui.CreateDCFromHandle(hWndDC)
#创建内存设备描述表
saveDC = mfcDC.CreateCompatibleDC()
#创建位图对象准备保存图片
saveBitMap = win32ui.CreateBitmap()
#为bitmap开辟存储空间
saveBitMap.CreateCompatibleBitmap(mfcDC,width,height)
#将截图保存到saveBitMap中
saveDC.SelectObject(saveBitMap)
#保存bitmap到内存设备描述表
saveDC.BitBlt((0,0), (width,height), mfcDC, (0, 0), win32con.SRCCOPY)
 
#如果要截图到打印设备:
###最后一个int参数:0-保存整个窗口,1-只保存客户区。如果PrintWindow成功函数返回值为1
#result = windll.user32.PrintWindow(hWnd,saveDC.GetSafeHdc(),0)
#print(result) #PrintWindow成功则输出1
 
#保存图像
##方法一:windows api保存
###保存bitmap到文件
saveBitMap.SaveBitmapFile(saveDC,"img_Winapi.bmp")
 
##方法二(第一部分):PIL保存
###获取位图信息
bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)
###生成图像
im_PIL = Image.frombuffer('RGB',(bmpinfo['bmWidth'],bmpinfo['bmHeight']),bmpstr,'raw','BGRX',0,1)
##方法二(后续转第二部分)
 
##方法三(第一部分):opencv+numpy保存
###获取位图信息
signedIntsArray = saveBitMap.GetBitmapBits(True)
##方法三(后续转第二部分)
 
#内存释放
win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hWnd,hWndDC)
 
##方法二(第二部分):PIL保存
###PrintWindow成功,保存到文件,显示到屏幕
im_PIL.save("im_PIL.png") #保存
im_PIL.show() #显示
 
##方法三(第二部分):opencv+numpy保存
###PrintWindow成功,保存到文件,显示到屏幕
im_opencv = numpy.frombuffer(signedIntsArray, dtype = 'uint8')
im_opencv.shape = (height, width, 4)
cv2.cvtColor(im_opencv, cv2.COLOR_BGRA2RGB)
cv2.imwrite("im_opencv.jpg",im_opencv,[int(cv2.IMWRITE_JPEG_QUALITY), 100]) #保存
cv2.namedWindow('im_opencv') #命名窗口
cv2.imshow("im_opencv",im_opencv) #显示
cv2.waitKey(0)
cv2.destroyAllWindows()

对桌面截图

截图整个桌面

import win32gui
import win32ui
import win32con
import win32api
 
# 获取桌面
hdesktop = win32gui.GetDesktopWindow()
# 分辨率适应
width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
# 创建设备描述表
desktop_dc = win32gui.GetWindowDC(hdesktop)
img_dc = win32ui.CreateDCFromHandle(desktop_dc)
# 创建一个内存设备描述表
mem_dc = img_dc.CreateCompatibleDC()
# 创建位图对象
screenshot = win32ui.CreateBitmap()
screenshot.CreateCompatibleBitmap(img_dc, width, height)
mem_dc.SelectObject(screenshot)
# 截图至内存设备描述表
mem_dc.BitBlt((0, 0), (width, height), img_dc, (0, 0), win32con.SRCCOPY)
# 将截图保存到文件中
screenshot.SaveBitmapFile(mem_dc, 'screenshot.bmp')
# 内存释放
mem_dc.DeleteDC()
win32gui.DeleteObject(screenshot.GetHandle())

以上就是python调用win32接口进行截图的示例的详细内容,更多关于python调用win32接口的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现SVN的目录周期性备份实例
Jul 17 Python
python爬虫的工作原理
Mar 05 Python
使用Django和Python创建Json response的方法
Mar 26 Python
Python快速查找list中相同部分的方法
Jun 27 Python
Python3中的bytes和str类型详解
May 02 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
使用Fabric自动化部署Django项目的实现
Sep 27 Python
python常用运维脚本实例小结
Feb 14 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
Python命名空间及作用域原理实例解析
Aug 12 Python
python绘制趋势图的示例
Sep 17 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 Python
python 下载m3u8视频的示例代码
Nov 11 #Python
pytorch简介
Nov 11 #Python
Python远程linux执行命令实现
Nov 11 #Python
python 实现简单的计算器(gui界面)
Nov 11 #Python
python海龟绘图之画国旗实例代码
Nov 11 #Python
python 实现倒计时功能(gui界面)
Nov 11 #Python
windows+vscode安装paddleOCR运行环境的步骤
Nov 11 #Python
You might like
模拟xcopy的函数
2006/10/09 PHP
elgg 获取文件图标地址的方法
2010/03/20 PHP
PHP 中文处理技巧
2010/04/25 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
详解PHP PDO简单教程
2019/05/28 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
一些mootools的学习资源
2010/02/07 Javascript
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
Moment.js 不容错过的超棒Javascript日期处理类库
2012/04/15 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
浅析javascript 定时器
2014/12/23 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
jquery及js实现动态加载js文件的方法
2016/01/21 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
Vue.js之slot深度复制详解
2017/03/10 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
python实现删除文件与目录的方法
2014/11/10 Python
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
财务副总经理工作职责
2013/11/25 职场文书
自我鉴定 电子商务专业
2014/01/30 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
节约用水倡议书
2014/04/16 职场文书
技校毕业生自荐书
2014/05/23 职场文书
欢迎新生标语2015
2015/07/16 职场文书