Python实现屏幕截图的两种方式
- 作者: 五速梦信息网
- 时间: 2026年04月04日 13:31
- 使用windows API
- 使用PIL中的ImageGrab模块
下面对两者的特点和用法进行详细解释。
一、Python调用windows API实现屏幕截图
好处是
- 灵活
- 速度快
缺点是:
- 写法繁琐
- 不跨平台
importtimeimportwin32gui, win32ui, win32con, win32apidefwindow_capture(filename): hwnd =0# 窗口的编号,0号表示当前活跃窗口 # 根据窗口句柄获取窗口的设备上下文DC(Divice Context) hwndDC =win32gui.GetWindowDC(hwnd) # 根据窗口的DC获取mfcDC mfcDC =win32ui.CreateDCFromHandle(hwndDC) # mfcDC创建可兼容的DC saveDC =mfcDC.CreateCompatibleDC() # 创建bigmap准备保存图片 saveBitMap =win32ui.CreateBitmap() # 获取监控器信息 MoniterDev =win32api.EnumDisplayMonitors(None, None) w =MoniterDev[0][2][2] h =MoniterDev[0][2][3] # print w,h #图片大小 # 为bitmap开辟空间 saveBitMap.CreateCompatibleBitmap(mfcDC, w, h) # 高度saveDC,将截图保存到saveBitmap中 saveDC.SelectObject(saveBitMap) # 截取从左上角(0,0)长宽为(w,h)的图片 saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY) saveBitMap.SaveBitmapFile(saveDC, filename)beg =time.time()fori inrange(10): window_capture("haha.jpg")end =time.time()print(end -beg)
输出结果为0.375秒,也就是说通过windows API每次截图只需要0.0375s,真是快得一逼呀。
二、使用PIL的ImageGrab模块
importtimeimportnumpy as npfromPIL importImageGrab# 每抓取一次屏幕需要的时间约为1s,如果图像尺寸小一些效率就会高一些beg =time.time()debug =Falsefori inrange(10): img =ImageGrab.grab(bbox=(250, 161, 1141, 610)) img =np.array(img.getdata(), np.uint8).reshape(img.size[1], img.size[0], 3)end =time.time()print(end -beg)
输出结果为4.015秒,也就是说截取一次屏幕需要半秒钟,更何况此处只截取了窗口的一部分矩形区域。所以ImageGrab模块能用是能用,就是有点慢。
三、使用Selenium截图
使用Selenium只能进行WEB程序截图
使用Selenium的各个浏览器需要制定驱动的位置,驱动下载地址参见Selenium 官网
fromselenium importwebdriverimporttimedefcapture(url, filename="capture.png"): browser =webdriver.Chrome(r"C:\Users\weidiao\Desktop\chromedriver_win32\chromedriver.exe") browser.set_window_size(1200, 900) browser.get(url) # Load page browser.execute_script(""" (function () { var y = 0; var step = 100; window.scroll(0, 0); function f() { if (y < document.body.scrollHeight) { y += step; window.scroll(0, y); setTimeout(f, 50); } else { window.scroll(0, 0); document.title += "scroll-done"; } } setTimeout(f, 1000); })(); """) fori inrange(30): if"scroll-done"inbrowser.title: break time.sleep(1) beg =time.time() fori inrange(10): browser.save_screenshot(filename) end =time.time() print(end -beg) browser.close()capture("//www.jb51.net")
打印时间为3.033s,速度介于windows API和PIL ImageGrab模块之间。
ps:下面看下python基础===python实现截图
fromPIL importImageGrabim =ImageGrab.grab() #可以添加一个坐标元组进去im.save('F:\\12.png')
- 上一篇: Python实现栈、队列、双端队列
- 下一篇: Python实现模拟登陆
相关文章
-
Python实现栈、队列、双端队列
Python实现栈、队列、双端队列
- 互联网
- 2026年04月04日
-
Python实战:美女图片下载器,海量图片任你下载
Python实战:美女图片下载器,海量图片任你下载
- 互联网
- 2026年04月04日
-
Python使用装饰器自动调用父类
Python使用装饰器自动调用父类
- 互联网
- 2026年04月04日
-
Python实现模拟登陆
Python实现模拟登陆
- 互联网
- 2026年04月04日
-
Python实现读取Excel文档中的配置并下载软件包
Python实现读取Excel文档中的配置并下载软件包
- 互联网
- 2026年04月04日
-
python实现scp拷贝
python实现scp拷贝
- 互联网
- 2026年04月04日





