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的Tornado框架中的协程异步实现原理
Apr 23 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
Jan 16 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
tensorflow实现加载mnist数据集
Sep 08 Python
python3.4控制用户输入与输出的方法
Oct 17 Python
Python3简单爬虫抓取网页图片代码实例
Aug 26 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
Python matplotlib实时画图案例
Apr 23 Python
基于python计算并显示日间、星期客流高峰
May 07 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
Elasticsearch 数据类型及管理
Apr 19 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彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
vue图片加载失败时用默认图片替换的方法
2019/08/29 Javascript
node crawler如何添加promise支持
2020/02/01 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
python的else子句使用指南
2016/02/27 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
解决pycharm的Python console不能调试当前程序的问题
2019/01/20 Python
python中的逆序遍历实例
2019/12/25 Python
pytorch实现线性拟合方式
2020/01/15 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
大学生就业推荐信范文
2013/11/29 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
经济贸易专业自荐信
2014/06/11 职场文书
医德医风个人工作总结2014
2014/11/14 职场文书
对公司的意见和建议
2015/06/04 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
linux目录管理方法介绍
2022/06/01 Servers