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 Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
详解python之简单主机批量管理工具
Jan 27 Python
Python 读取指定文件夹下的所有图像方法
Apr 27 Python
Python使用Phantomjs截屏网页的方法
May 17 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
Python 获取中文字拼音首个字母的方法
Nov 28 Python
python调用staf自动化框架的方法
Dec 26 Python
opencv python如何实现图像二值化
Feb 03 Python
Python网络爬虫四大选择器用法原理总结
Jun 01 Python
next在python中返回迭代器的实例方法
Dec 15 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
Feb 03 Python
python实现Thrift服务端的方法
Apr 20 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的引用原因分析
2012/09/06 PHP
destoon各类调用汇总
2014/06/20 PHP
简单实现php上传文件功能
2017/09/21 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
js图片轮播效果实现代码
2020/04/18 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
2016/05/31 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python脚本实现下载合并SAE日志
2015/02/10 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
解释一下抽象方法和抽象类
2016/08/27 面试题
大学生求职信例文
2014/06/29 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
2015年行政部工作总结
2015/04/28 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
新生儿未入户证明
2015/06/23 职场文书
化工厂员工工作总结
2015/10/15 职场文书
话题作文之诚信
2019/11/28 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python