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函数装饰器用法实例详解
Jun 04 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
Python利用pandas计算多个CSV文件数据值的实例
Apr 19 Python
解决Python网页爬虫之中文乱码问题
May 11 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
python编程进阶之异常处理用法实例分析
Feb 21 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
python生成xml时规定dtd实例方法
Sep 21 Python
Python Selenium操作Cookie的实例方法
Feb 28 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/10/09 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
php命名空间学习详解
2014/02/27 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
js代码实现微博导航栏
2015/07/30 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
js注意img图片的onerror事件的分析
2011/01/01 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
兼容FF和IE的动态table示例自写
2013/10/21 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
vue-cli axios请求方式及跨域处理问题
2018/03/28 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
python添加模块搜索路径方法
2017/09/11 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
详解Python 解压缩文件
2019/04/09 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
毕业生造价工程师求职信
2013/10/17 职场文书
小学生运动会报道稿
2014/09/12 职场文书
详解MindSpore自定义模型损失函数
2021/06/30 Python