前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Python来截图

使用Python来截图

作者头像
青南
发布2019-01-09 11:40:49
1.2K0
发布2019-01-09 11:40:49
举报
文章被收录于专栏:未闻Code未闻Code

起因

在极客学院讲授《使用Python编写远程控制程序》的课程中,涉及到查看被控制电脑屏幕截图的功能。

如果使用PIL,这个需求只需要三行代码:

代码语言:javascript
复制
from PIL import ImageGrab
pic = ImageGrab.grab()
pic.save('1.jpg')

但是考虑到被控端应该尽量的精简,对其他模块尽量少的依赖,这样才能比较方便的部署,因此我考虑能否有一种方法,不依赖PIL来实现截图的功能。

思路

由于被控端使用了win32api, 因此有一个方法:

代码语言:javascript
复制
win32api.keybd_event

这个方法可以模拟键盘的按键动作。因此,解决方法就比较的明显了:

  1. 模拟键盘上面的“Print Screen” 键按下
  2. 从剪贴板中读取出截图
  3. 将截图保存到本地

第一步非常的简单,实用win32api 和 win32con,两行代码就能实现:

代码语言:javascript
复制
import win32api
import win32con
win32api.keybd_event(win32con.VK_SNAPSHOT, 0)

其中win32con这个库里面包含了很多定义好的和Windows相关的常量,而VK_SNAPSHOT就是Print Screen键的键位码。后面的数字0表示截取整个屏幕。如果改成数字1,表示截取当前窗口。

那么现在问题来了,在不实用PIL的情况下,如何将剪贴板你们的图片保存到本地?

win32api有一个模块 win32clipboard 是负责剪贴板相关的操作。它有一个方法:

代码语言:javascript
复制
win32clipboard.GetClipboardData(formats)

这个方法可以从剪贴板里面读取数据。但是需要指定数据的格式。从这里.aspx)可以查看到更多的标准剪贴板格式(Standard Clipboard Formats).

一开始我使用的formats是CF_BITMAP,程序返回的是一串整数,怀疑应该是一个内存地址。这也和这个format的描述:

A handle to a bitmap (HBITMAP).

是一致的,它是一个handle。

我也尝试过CF_TIFF, 不过程序直接报错了,可见我使用Print Screen截图以后,剪贴板里面的图片格式并不是TIFF。

经过查阅其他资料,我最后确定使用了CF_DIB。

A memory object containing a BITMAPINFO structure followed by the bitmap bits.

这个描述说明,CF_DIB返回的是一个内存对象,包含了BIT格式图片的信息。经过测试使用:

代码语言:javascript
复制
win32clipboard.GetClipboardData(win32con.CF_DIB)

以后,可以得到一个很大的字符串。显然这个字符串就是图片的内容了。但是当我把这个字符串写入到bmp格式的文件后,却发现图片无法打开。

解决办法

请戳阅读原文->

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 起因
  • 思路
  • 解决办法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档