python学习——截图工具编写
学习一门语言最好的方法便是实践,想要拿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学习——截图工具编写的更多相关文章
- Python学习(一):编写购物车
1.购物车流程图: 2.代码实现: #!/usr/bin/env python #coding=utf-8 ChoiceOne =''' 1.查看余额 2.购物 3.退出 ''' ChoiceTwo ...
- python 学习(pip工具的安装)
mac 电脑上使用终端命令 curl https://bootstrap.pypa.io/get-pip.py | python3 基于Python 3 pip --version pip3 list ...
- Python学习第二天-编写三级菜单
编写三级菜单:1. 运行程序输出第一级菜单2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单3. 菜单数据保存在文件中4. 让用户选择是否要退出5. 有返回上一级菜单的功能 # Author: z ...
- Python学习第一天-编写登陆接口
编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 帐号文件user.txt内容如下: qaz 123qwe 12345qweqwr 12321424...... 锁文件user_l ...
- Python学习笔记-练习编写ATM+购物车(购物商城)
作业需求: 模拟实现一个ATM + 购物商城程序: 1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.支持多账户登录 5.支持账户间 ...
- Python学习第二天-编写购物车
需求:1.启动程序后,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 ...
- 吴裕雄--天生自然python学习笔记:编写网络爬虫代码获取指定网站的图片
我们经常会在网上搜索井下载图片,然而一张一张地下载就太麻烦了,本案例 就是通过网络爬虫技术, 一次性下载该网站所有的图片并保存 . 网站图片下载并保存 将指定网站的 .jpg 和 .png 格式的图片 ...
- Python学习资料整理以及书籍、开发工具推荐
我不知道大家学习Python的时候是不是和我一样感觉很无助,不知道在入门或者进阶的时候应该掌握哪些知识点,下面我就梳理下我自己学习Python开 发的过程及资料分享给大家,这些方法资料可能并不适合所有 ...
- Python学习笔记 (1) :python简介、工具、编码及基础运算
学习背景: 精通一门编程语言并编写出自己喜欢的程序是我多年的梦想,一定要找时间实现.此时想起了高中时的我对编程的兴趣十分浓厚,父母给自己购买了学习机插卡式的,只能敲basic代码,同时学校有386计算 ...
随机推荐
- 密钥登录linux
一.linux 主机A登录linux主机B 在/etc/hosts文件下加入:(做硬解析) 192.168.1.60 u60 #设置u60为主机名 在节点A上创建RSA秘钥:(A上生成A主机密钥) # ...
- AsyncQueryHandler处理数据
参考:http://blog.csdn.net/hfreeman2011/article/details/8555474和http://blog.csdn.net/dragondog/article/ ...
- iOS开发之理解iOS中的MVC设计模式
模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程 ...
- java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法
java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法 只需把这三个commons-pool.jar ...
- 引入工程报包导入异常:import javax.servlet.annotation.WebFilter;
引入工程报包导入异常:import javax.servlet.annotation.WebFilter; (2013-02-21 16:38:00) 分类: java 今天上午导入了一个项目,用 ...
- application(CURD)--easyui
一,效果图. 二,源代码. <!DOCTYPE html><html><head> <meta charset="UTF-8"> & ...
- applicationContext.xml详解
http://blog.csdn.net/heng_ji/article/details/7022171
- [javascript]一种兼容性比较好的简单拖拽
作为一个马上要找工作.非计算机专业.热爱前端的大四狗,最近开始疯狂写demo.看书,准备九.十月份的校招. 晚上用js实现了一个比较简单(low)的拖拽效果,初步测试兼容性还是不错的,于是写一段小博文 ...
- 语法糖----JAVA
语法糖 语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这种语法能使程序 ...
- php函数参数
函数的参数 通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表.参数是从左向右求值的. PHP 支持按值传递参数(默认),通过引用传递参数以及默认参数.也支持可变长度参数列表,更多信息参见 ...