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中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
Python写的Socks5协议代理服务器
Aug 06 Python
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
Python3.6安装及引入Requests库的实现方法
Jan 24 Python
Python之csv文件从MySQL数据库导入导出的方法
Jun 21 Python
django与小程序实现登录验证功能的示例代码
Feb 19 Python
python日志logging模块使用方法分析
May 23 Python
python2使用bs4爬取腾讯社招过程解析
Aug 14 Python
python如何实现不可变字典inmutabledict
Jan 08 Python
部署Django到阿里云服务器教程示例
Jun 03 Python
python的数学算法函数及公式用法
Nov 18 Python
Python实现批量自动整理文件
Mar 16 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/11/26 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
javascript实现rgb颜色转换成16进制格式
2015/07/10 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
微信小程序实现文字跑马灯效果
2020/05/26 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
[02:07]DOTA2新英雄展现中国元素,完美“圣典”亮相央视
2016/12/19 DOTA
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
使用Python操作MySQL的一些基本方法
2015/08/16 Python
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
python抖音表白程序源代码
2019/04/07 Python
学习Django知识点分享
2019/09/11 Python
python归并排序算法过程实例讲解
2020/11/04 Python
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
数据库的约束含义
2012/09/09 面试题
市场营销管理毕业生自荐信
2014/03/03 职场文书
聚美优品恶搞广告词
2014/03/14 职场文书
三严三实心得体会范文
2014/10/13 职场文书
学雷锋日活动总结
2015/02/06 职场文书
义卖募捐活动总结
2015/05/09 职场文书
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB
Mysql案例刨析事务隔离级别
2021/09/25 MySQL