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 numpy数组中冒号的使用方法详解
Apr 17 Python
wxPython的安装与使用教程
Aug 31 Python
python中正则表达式与模式匹配
May 07 Python
将Python字符串生成PDF的实例代码详解
May 17 Python
Python基础学习之时间转换函数用法详解
Jun 18 Python
通过PYTHON来实现图像分割详解
Jun 26 Python
使用Python进行防病毒免杀解析
Dec 13 Python
dpn网络的pytorch实现方式
Jan 14 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
python爬虫用scrapy获取影片的实例分析
Nov 23 Python
python数字图像处理:图像简单滤波
Jun 28 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
PHP如何通过传引用的思想实现无限分类(代码简单)
2015/10/13 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
Python爬取京东的商品分类与链接
2016/08/26 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
谈谈python垃圾回收机制
2020/09/27 Python
python 如何停止一个死循环的线程
2020/11/24 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
理工类毕业自我鉴定
2014/02/20 职场文书
党员公开承诺书和承诺事项
2014/03/25 职场文书
篮球社团活动总结
2014/06/27 职场文书
新学期开学标语
2014/06/30 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
工作表扬信范文
2015/01/17 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
python 如何在 Matplotlib 中绘制垂直线
2021/04/02 Python