使用windows API

使用PIL中的ImageGrab模块

下面对两者的特点和用法进行详细解释。

一、Python调用windows API实现屏幕截图

好处是灵活

速度快

缺点是:写法繁琐

不跨平台

import timeimport win32gui, win32ui, win32con, win32apidef window_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()for i in range(10):

window_capture("haha.jpg")

end = time.time()print(end - beg)

输出结果为0.375秒,也就是说通过windows API每次截图只需要0.0375s,真是快得一逼呀。

二、使用PIL的ImageGrab模块

import timeimport numpy as npfrom PIL import ImageGrab# 每抓取一次屏幕需要的时间约为1s,如果图像尺寸小一些效率就会高一些beg = time.time()

debug = Falsefor i in range(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 官网

from selenium import webdriverimport timedef capture(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);    })();  """)    for i in range(30):        if "scroll-done" in browser.title:            break

time.sleep(1)

beg = time.time()    for i in range(10):

browser.save_screenshot(filename)

end = time.time()    print(end - beg)

browser.close()

capture("http://www.cnblogs.com/weidiao")

打印时间为3.033s,速度介于windows API和PIL ImageGrab模块之间。

python截图拼接_Python实现屏幕截图有两种方式 - 小众知识相关推荐

  1. python动态捕捉屏幕_Python实现屏幕截图的两种方式

    使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处是 灵活 速度快 缺点是: 写法繁琐 ...

  2. python扩展屏幕截图_Python实现屏幕截图的两种方式

    Python实现屏幕截图的两种方式 使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处 ...

  3. python 设置时区_python时区设置的两种方式

    第一种用pytz 第二种手动加时区再转换格式 a= datetime.datetime.today() o = datetime.timedelta(hours=8) (a+o).strftime(& ...

  4. python启动方法_python进程开启的两种方式

    一.进程 1.1.方式一 from multiprocessing import Process import time #方式一 def task(name): print(f"my na ...

  5. Python实现屏幕截图的两种方式

    Python实现屏幕截图的两种方式 使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处 ...

  6. python循环展示大写字母_python调用大写函数python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

  7. python怎么下载图片怎么保存到本地_详解Python下载图片并保存本地的两种方式

    一:使用Python中的urllib类中的urlretrieve()函数,直接从网上下载资源到本地,具体代码: import os,stat import urllib.request img_url ...

  8. python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

  9. python opencv 裁剪图片_Python图片裁剪的两种方式——Pillow和OpenCV

    在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. OpenCV ...

最新文章

  1. pip更换国内镜像源
  2. multiple definition of
  3. 修改wamp的apache默认端口80为8088以及www目录
  4. Linux 下查看系统是32位 还是64 位的方法
  5. jzoj3301-[集训队互测2013]家族【并查集,暴力】
  6. 【渝粤教育】国家开放大学2018年秋季 2083T信息技术与教育技术(2) 参考试题
  7. day 05 多行输出与多行注释、字符串的格式化输出、预设创建者和日期
  8. 健康评测 php,8款超好用的健康APP测评推荐!
  9. Java数据结构和算法-二叉树
  10. rest教程_REST保证教程
  11. mysql更改密码_Mysql更改密码、连接mysql、mysql常用命令
  12. 【英雄联盟动画-双城之战】10点首播!6亿召唤师快来
  13. 音频 ASIO 驱动开发
  14. java xps生成_Java PDF/XPS转为Word/html /SVG、PDF和XPS互转
  15. 趣味CSS3(一)--旋转的大风车
  16. 网易面试总结——面试案例9~面试案例12
  17. 交互式电子白板与计算机通过什么链接,交互式电子白板的作用详细介绍
  18. SQL报错:Ambiguous column name ‘数据库某列’
  19. 给PPT插入页码和总页码
  20. math函数常用操作

热门文章

  1. RabbitMQ 入门:2. Exchange 和 Queue
  2. 基于.NET Core的优秀开源项目合集
  3. Windows 7 安装 .NET 5 / .NET Core 3.1 环境的方法和依赖文件
  4. 玩转控件:对Dev的GridControl控件扩展
  5. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(三)
  6. 200行代码,7个对象——让你了解ASP.NET Core框架的本质[3.x版]
  7. 从壹开始学习 NetCore 新篇章 ║ Blog.Core 开发社之招募计划书
  8. Abp 0.18.0 正式发布! -ABP CLI,新模板和其他功能
  9. Linux中以单容器部署Nginx+ASP.NET Core
  10. 张高兴的 .NET Core IoT 入门指南:(二)GPIO 的使用