Python实现可自定义大小的截屏功能


Posted in Python onJanuary 20, 2018

本文实例讲述了Python实现可自定义大小的截屏功能。分享给大家供大家参考,具体如下:

蝈蝈这两天正忙着收拾家当去公司报道,结果做PHP的发小蛐蛐找到了他,说是想要一个可以截图工具。

大致需要做出这样的效果。

Python实现可自定义大小的截屏功能

虽然已经很久不写Python代码了,但是没办法,盛情难却啊,只好硬着头皮上了。

关于这个需求,蝈蝈想了想,脑海里大概有这么几个实现的方式。

① 调用QQ的截图工具。
② 自己写一个。

这第一个嘛,应了那句老话。理想很丰满,现实很骨感。因为被集成的缘故,剖不出来是没办法用的,自认为技术还不到家的蝈蝈很快放弃了这个方法。

那么只能自己写一个了。从谷哥那了解到PIL的ImageGrab可以很方便的截图,默认截图是全屏范围,当然也可以传递一个Bbox元组来实现截图的范围截图。于是思路就很明确了:获取鼠标位置,调用ImageGrab截图

获取鼠标位置

这个嘛,其实还是很简单的。借助pyHook就可以啦。

global old_x, old_y, new_x, new_y, full, hm
  if event.MessageName == "mouse left down":
    old_x, old_y = event.Position
  if event.MessageName == "mouse left up":
    new_x, new_y = event.Position

按下鼠标的那一刻开始记录初始坐标,然后鼠标抬起的那一刻更新结束坐标。这两个坐标的范围就是要截图的范围。这里面需要注意的就是鼠标坐标默认从左上角(0, 0)开始。

截图的具体实现

关于具体实现,无非是一个full标记,默认也是截全屏的图,当full为False的时候,按照两次鼠标的绝对位置实现范围截图。

# 划屏
  if full:
    image = ImageGrab.grab((0, 0, gsm(0), gsm(1)))
  else:
    image = ImageGrab.grab((old_x, old_y, new_x, new_y))
  image.show()

好啦,核心功能已经做好啦。为了方便蛐蛐进行自定义的拓展,蝈蝈把源码发给了他。

# coding: utf8
# @Author: 郭 璞
# @File: capture.py
# @Time: 2017/7/24
# @Contact: 1064319632@qq.com
# @blog: http://blog.csdn.net/marksinoberg
# @Description: 根据鼠标移动进行划屏截图
import pyHook
import pythoncom
import win32gui
from PIL import Image, ImageGrab
from win32api import GetSystemMetrics as gsm
# 提前绑定鼠标位置事件
old_x, old_y = 0, 0
new_x, new_y = 0, 0
def hotkey(key=None):
  """绑定热键,开始进行划屏截图操作"""
  pass
def on_mouse_event(event):
  global old_x, old_y, new_x, new_y, full, hm
  if event.MessageName == "mouse left down":
    old_x, old_y = event.Position
  if event.MessageName == "mouse left up":
    new_x, new_y = event.Position
    # 解除事件绑定
    hm.UnhookMouse()
    hm = None
  # 划屏
  if full:
    image = ImageGrab.grab((0, 0, gsm(0), gsm(1)))
  else:
    image = ImageGrab.grab((old_x, old_y, new_x, new_y))
  image.show()
full = False
hm = None
def capture():
  hm = pyHook.HookManager()
  hm.SubscribeMouseAll(on_mouse_event)
  hm.HookMouse()
  pythoncom.PumpMessages()
capture()

核心功能已经算是完成了,虽然貌似并没有什么太大的用处。

Python实现可自定义大小的截屏功能

因为就要走了,所以蝈蝈没有多少时间来润色,只能这样匆匆交差了。除了代码,蝈蝈特意嘱咐了下面这几句话:

① 增加保存到本地功能。
② 绑定系统快捷键,这样打游戏的时候也可以截图。
③ 增加蒙层,截图的时候提供更好的用户体验。

蛐蛐听完之后,貌似也有了自己的想法,然后就自己琢磨去了。其实他不知道的是,蝈蝈对于截到的图的另一层处理。

简易图片相似度分析

# coding: utf8
# @Author: 郭 璞
# @File: similar.py
# @Time: 2017/7/23
# @Contact: 1064319632@qq.com
# @blog: http://blog.csdn.net/marksinoberg
# @Description: 两张图片相似度计算实现。
from PIL import Image
def pixel_way(img1, img2):
  image1 = Image.open(img1, 'r')
  image2 = Image.open(img2, 'r')
  return get_pixel_details(image1)==get_pixel_details(image2)
def get_pixel_details(img):
  pixels = img.load()
  r, g, b = 0, 0, 0
  counter = 0
  for x in range(img.size[0]):
    for y in range(img.size[1]):
      counter += 1
      r1, g1, b1 = pixels[x, y]
      r += r1
      g += g1
      b += b1
  return (r/counter, g/counter, b/counter)
if __name__ == '__main__':
  image1 = r'./1.png'
  image2 = r'./1.png'
  img = Image.open(image1, 'r')
  img.resize((256,256)).convert("RGB")
  print(pixel_way(image1, image2))

图片像素直方图

# coding: utf8
# @Author: 郭 璞
# @File: pixel-compare.py
# @Time: 2017/7/24
# @Contact: 1064319632@qq.com
# @blog: http://blog.csdn.net/marksinoberg
# @Description: 计算RGB值相关
from PIL import Image
from PIL import ImageDraw
im = Image.open('1.png')
im = im.convert("L")
width, height = im.size
pix = im.load()
a = [0]*256
for w in range(width):
  for h in range(height):
    p = pix[w, h]
    a[p] = a[p] + 1
x = max(a)
print(a, "---", len(a), '-----', x)
image = Image.new('RGB', (256, 256), (255, 255, 255))
draw = ImageDraw.Draw(image)
for k in range(256):
  a[k] = a[k]*200/x
  source = (k, 255)
  target = (k, 255-a[k])
  draw.line([source, target], (100, 100, 100))
image.show()

还有很多更好玩的,但是有时候,话多,不是一件好事,想到这里,蝈蝈又不自觉的回忆起了那段不堪的帮忙的经历,无奈……

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python读取html中指定元素生成excle文件示例
Apr 03 Python
利用Django框架中select_related和prefetch_related函数对数据库查询优化
Apr 01 Python
python简单猜数游戏实例
Jul 09 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
Python 爬虫的工具列表大全
Jan 31 Python
Python 创建空的list,以及append用法讲解
May 04 Python
Python 调用 zabbix api的方法示例
Jan 06 Python
python 图像平移和旋转的实例
Jan 10 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
windows环境中利用celery实现简单任务队列过程解析
Nov 29 Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 Python
浅析python 字典嵌套
Sep 29 Python
python+matplotlib绘制饼图散点图实例代码
Jan 20 #Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 #Python
Python搭建FTP服务器的方法示例
Jan 19 #Python
python re模块findall()函数实例解析
Jan 19 #Python
Python enumerate索引迭代代码解析
Jan 19 #Python
5个很好的Python面试题问题答案及分析
Jan 19 #Python
Python3实现的画图及加载图片动画效果示例
Jan 19 #Python
You might like
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
一个图形显示IP的PHP程序代码
2007/10/19 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
一些有关检查数据的JS代码
2006/09/07 Javascript
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
python实现自动化上线脚本的示例
2019/07/01 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
什么是Python中的顺序表
2020/06/02 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5样式控制示例代码
2013/11/27 HTML / CSS
Structs界面控制层技术
2013/10/11 面试题
个人简历自我评价怎么写
2015/03/10 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
2019思想汇报范文
2019/05/21 职场文书
MySQL数据库 安全管理
2022/05/06 MySQL
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL