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 排列组合之itertools
Mar 20 Python
python监控网站运行异常并发送邮件的方法
Mar 13 Python
详解Python中的join()函数的用法
Apr 07 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
python安装scipy的方法步骤
Jun 26 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
Python3enumrate和range对比及示例详解
Jul 13 Python
pyspark 随机森林的实现
Apr 24 Python
Python手动或自动协程操作方法解析
Jun 22 Python
详解python日志输出使用配置文件格式
Feb 10 Python
OpenCV-Python实现人脸美白算法的实例
Jun 11 Python
python使用BeautifulSoup 解析HTML
Apr 24 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
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
php查询whois信息的方法
2015/06/08 PHP
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
$.ajax json数据传递方法
2008/11/19 Javascript
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
jQuery 获取URL参数的插件
2010/03/04 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
vue中用动态组件实现选项卡切换效果
2017/03/25 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
vue如何判断dom的class
2018/04/26 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
swiper4实现移动端导航栏tab滑动切换
2020/10/16 Javascript
Python矩阵常见运算操作实例总结
2017/09/29 Python
python调试神器PySnooper的使用
2019/07/03 Python
django fernet fields字段加密实践详解
2019/08/12 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
后进生转化工作制度
2014/01/17 职场文书
二年级评语大全
2014/04/23 职场文书
火灾现场处置方案
2014/05/28 职场文书
生物工程专业求职信
2014/09/03 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
单位考核聘任报告
2015/03/02 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
感动中国何玥观后感
2015/06/02 职场文书