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 相关文章推荐
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 Python
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
python运行时强制刷新缓冲区的方法
Jan 14 Python
Python 实现try重新执行
Dec 21 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
Sep 23 Python
Python selenium的这三种等待方式一定要会!
Jun 10 Python
Python语言规范之Pylint的详细用法
Jun 24 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
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
初识php MVC
2014/09/10 PHP
php菜单/评论数据递归分级算法的实现方法
2019/08/01 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
js 获取、清空input type="file"的值示例代码
2014/02/19 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
Node学习记录之cluster模块
2017/05/31 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
电子商务专业个人的自我评价
2013/11/19 职场文书
七一党建活动方案
2014/01/28 职场文书
2014年除四害工作总结
2014/12/06 职场文书
合理化建议书
2015/02/04 职场文书
2019年工作总结范文
2019/05/21 职场文书