欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-05 09:43:17
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接口的资料请关注其它相关文章!