当前位置: 移动技术网 > IT编程>脚本编程>Python > python调用win32接口进行截图的示例

python调用win32接口进行截图的示例

2020年11月11日  | 移动技术网IT编程  | 我要评论
python的版本及依赖的库的安装#版本python 3.7.1pip install pywin32==224pip install numpy==1.15.3pip install opencv-

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接口的资料请关注移动技术网其它相关文章!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网