学习一门语言最好的方法便是实践,想要拿Python写一个截图工具,网上一搜资料果然已经很多,前辈们都已经做的很到位了。现在就一步步来学习一下:

首先学习截图整个桌面的方法,可以使用Python中的PIL(Python Imaging Library)库里边的ImageGrab.grab()函数来获取截图。然后使用save()函数将图片保存下来。简单的不能再简单了,源码如下:

from PIL import ImageGrab
pic = ImageGrab.grab()
pic.save("D:\\picture.jpg")

这样我们便可以将整个桌面截图保存在D盘根目录下。So easy。另外关于图片存储格式,使用save()函数保存时路径中文件格式为jpg、bmp、png均可,亲测可行,bmp格式存储空间最大,理论上来说数据失真率也最低。

下面我们考虑如何将当前窗口截图保存,ImageGrab.grab()函数没有参数时默认将整个屏幕截图,当我们给它传递一个矩形的坐标时,它便可以将制定矩形进行截图。同时这里我们需要在python中调用win32的GUI函数来获取当前窗口的句柄、进而获取当前窗口的位置坐标。同时,我们需要在python中定义一个结构体来存储获取的坐标值,于是我们又学习了python中结构体的定义以及win32 gui函数调用的方法,源码如下:

import win32gui
from ctypes import *
import ctypes
from PIL import ImageGrab
import win32api,win32con
import pyHook
import pythoncom #定义结构体,存储当前窗口坐标
class RECT(ctypes.Structure):
_fields_ = [('left', ctypes.c_int),
('top', ctypes.c_int),
('right', ctypes.c_int),
('bottom', ctypes.c_int)]
rect = RECT()
HWND = win32gui.GetForegroundWindow()#获取当前窗口句柄
ctypes.windll.user32.GetWindowRect(HWND, ctypes.byref(rect))#获取当前窗口坐标
coordinate = (rect.left+2, rect.top+2, rect.right-2, rect.bottom-2)#转换为预截图窗口坐标
pic = ImageGrab.grab(coordinate)#截图
pic.save("D:\\321.jpg")#保存

其中ctypes中的byref()方法是用来返回结构体的指针,从而将窗口坐标存储在结构体中。

在实现了全屏截图以及指定窗口截图以后,我们便需要考虑如何实现指定范围截图。我的思路是利用pyHook工具包实现对鼠标事件的监听,在鼠标左键按下时,记录一个坐标,鼠标左键抬起时再记录一个坐标,于是便可以确定整个所要截图区域的矩形坐标,再使用ImageGrab.grab(coordinate)函数实现截图。源码如下:

coordinate = [1,1,1,1]
#监听键盘事件
def on_mouse_event(event):
if event.MessageName == 'mouse left down':
coordinate[0:2] = event.Position
elif event.MessageName == 'mouse left up':
coordinate[2:4] = event.Position
win32api.PostQuitMessage()#退出监听循环
pic = ImageGrab.grab(coordinate)
pic.save("D:\\321.jpg")
return True hm = pyHook.HookManager()#创建一个钩子管理对象
hm.MouseAll = on_mouse_event#监听所有鼠标事件
hm.HookMouse()#设定鼠标钩子
pythoncom.PumpMessages()#进入循环,程序一直监听

这里我们在鼠标完成截图矩形坐标确定后,需要推出鼠标事件的监听。另外,目前存在一个问题,在用鼠标选取范围时会导致窗口焦点的改变,从而影响实际截图内容。因此可以进一步考虑先将屏幕锁定,再进行范围选定。或者也许可以先进行全屏截图,但仅显示而不保存,在显示的全屏截图上再进行区域截图。

恩,好了,一步步来,慢慢学习。菜鸟慢飞。

python学习——截图工具编写的更多相关文章

  1. Python学习(一):编写购物车

    1.购物车流程图: 2.代码实现: #!/usr/bin/env python #coding=utf-8 ChoiceOne =''' 1.查看余额 2.购物 3.退出 ''' ChoiceTwo ...

  2. python 学习(pip工具的安装)

    mac 电脑上使用终端命令 curl https://bootstrap.pypa.io/get-pip.py | python3 基于Python 3 pip --version pip3 list ...

  3. Python学习第二天-编写三级菜单

    编写三级菜单:1. 运行程序输出第一级菜单2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单3. 菜单数据保存在文件中4. 让用户选择是否要退出5. 有返回上一级菜单的功能 # Author: z ...

  4. Python学习第一天-编写登陆接口

    编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 帐号文件user.txt内容如下: qaz 123qwe 12345qweqwr 12321424...... 锁文件user_l ...

  5. Python学习笔记-练习编写ATM+购物车(购物商城)

    作业需求: 模拟实现一个ATM + 购物商城程序: 1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.支持多账户登录 5.支持账户间 ...

  6. Python学习第二天-编写购物车

    需求:1.启动程序后,让用户输入工资,然后打印商品列表         2.允许用户根据商品编号购买商品         3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒          ...

  7. 吴裕雄--天生自然python学习笔记:编写网络爬虫代码获取指定网站的图片

    我们经常会在网上搜索井下载图片,然而一张一张地下载就太麻烦了,本案例 就是通过网络爬虫技术, 一次性下载该网站所有的图片并保存 . 网站图片下载并保存 将指定网站的 .jpg 和 .png 格式的图片 ...

  8. Python学习资料整理以及书籍、开发工具推荐

    我不知道大家学习Python的时候是不是和我一样感觉很无助,不知道在入门或者进阶的时候应该掌握哪些知识点,下面我就梳理下我自己学习Python开 发的过程及资料分享给大家,这些方法资料可能并不适合所有 ...

  9. Python学习笔记 (1) :python简介、工具、编码及基础运算

    学习背景: 精通一门编程语言并编写出自己喜欢的程序是我多年的梦想,一定要找时间实现.此时想起了高中时的我对编程的兴趣十分浓厚,父母给自己购买了学习机插卡式的,只能敲basic代码,同时学校有386计算 ...

随机推荐

  1. ThreadLocal 和 InheritableThreadLocal (引用)

    ThreadLocal:http://www.cnblogs.com/moonandstar08/p/4912673.html InheritableThreadLocal:  http://www. ...

  2. VMware-Workstation安装在ubuntu15.04(内核3.19)

    安装的最新版的linux15.04 安装VMware-Workstation11,运行gui程序的时候出现,VMware Kernel Module Update的提示窗口, 说是要更新vmnet-d ...

  3. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

  4. nginx前端负载,后端apache获取真实IP设置

    原文链接: nginx前端负载,后端apache获取真实IP设置 参考文献: 前端Nginx,后端Apache获取用户真实IP地址  按照第二种方法设置不成功! 网站最前端是nginx,做的PROXY ...

  5. hadoop -- mapreduce执行过程

    1.运行mapreduce程序  ---run2.本次运行将会生成呢个一个Job , 于是JobClient向JobTracker申请一个JobID 标识该Job.3.JobClient将Job需要的 ...

  6. Raphael Js矢量库API简介:

    Raphael Js矢量库API简介:Raphael Javascript 是一个 Javascript的矢量库. 2010年6月15日,著名的JavaScript库ExtJS与触摸屏代码库项目jQT ...

  7. windows下安装ruby和 rails的痛苦经历

    准备安装ruby on rails,在网上搜了下,步骤都类似,但实际安装过程中却碰到很多问题.下面详细说下: 说明下,文章是按照我尝试的过程描述的.但最终是靠 运行 railsinstaller一键式 ...

  8. Linux环境下编译并执行ava helloworld程序

    原文:http://blog.lupaworld.com/home-space-uid-24466-do-blog-id-2578.html 已经学会怎样在Windows下怎样编辑,编译和运行Java ...

  9. csu1306: Manor

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1306 解题思路:唬人的水题,只要按照他的意思打,就能过,不过,数组最好开大点.用到优先队列,也可以 ...

  10. leetcode第一刷_Binary Tree Inorder Traversal

    递归实现当然太简单,也用不着为了ac走这样的捷径吧..非递归实现还挺有意思的. 树的非递归遍历一定要借助栈,相当于把原来编译器做的事情显式的写出来.对于中序遍历,先要訪问最左下的节点,一定是进入循环后 ...