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 相关文章推荐
python2.7删除文件夹和删除文件代码实例
Dec 18 Python
python实现忽略大小写对字符串列表排序的方法
Sep 25 Python
Python中的字典遍历备忘
Jan 17 Python
Python中的tuple元组详细介绍
Feb 02 Python
python实现清屏的方法
Apr 30 Python
用python制作游戏外挂
Jan 04 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
python构建深度神经网络(续)
Mar 10 Python
python实现根据给定坐标点生成多边形mask的例子
Feb 18 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 Python
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
Aug 14 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
php 中的str_replace 函数总结
2007/04/27 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
javascript call和apply方法
2008/11/24 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
Vue Autocomplete 自动完成功能简单示例
2019/05/25 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
中医临床专业自我鉴定范文
2014/01/15 职场文书
《这儿真好》教学反思
2014/02/22 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
出国签证在职证明范本
2014/11/24 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP