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动态性强类型用法实例
May 09 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
Python爬虫代理IP池实现方法
Jan 05 Python
python遍历序列enumerate函数浅析
Oct 17 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
Jul 10 Python
Mac下Anaconda的安装和使用教程
Nov 29 Python
django迁移数据库错误问题解决
Jul 29 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
python实现静态web服务器
Sep 03 Python
Python3连接Mysql8.0遇到的问题及处理步骤
Feb 17 Python
如何提高python 中for循环的效率
Apr 15 Python
如何利用Python写个坦克大战
Nov 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
晶体管来复再生式二管收音机
2021/03/02 无线电
由php if 想到的些问题
2008/03/22 PHP
php PDO中文乱码解决办法
2009/07/20 PHP
劣质的PHP代码简化
2010/02/08 PHP
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
js设置默认时间跨度过程详解
2019/07/17 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
Python实现购物车功能的方法分析
2017/11/10 Python
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
python使用建议与技巧分享(一)
2020/08/17 Python
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
挪威手表购物网站:Klokker
2016/09/19 全球购物
美国女性运动零售品牌:Lady Foot Locker
2017/05/12 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
电大毕业生自我鉴定
2013/11/10 职场文书
春节联欢晚会主持词
2014/03/24 职场文书
活动总结模板
2014/05/09 职场文书
学习考察心得体会
2014/09/04 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL