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基于生成器迭代实现的八皇后问题示例
May 23 Python
opencv python 基于KNN的手写体识别的实例
Aug 03 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
python生成带有表格的图片实例
Feb 03 Python
在cmd中查看python的安装路径方法
Jul 03 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
Python基于read(size)方法读取超大文件
Mar 12 Python
python 数据分析实现长宽格式的转换
May 18 Python
python如何查看安装了的模块
Jun 23 Python
Python如何绘制日历图和热力图
Aug 07 Python
Python requests HTTP验证登录实现流程
Nov 05 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边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
php处理restful请求的路由类分享
2014/02/27 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
php中file_exists函数使用详解
2015/05/08 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
javascript prototype 原型链
2009/03/12 Javascript
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
深入浅出讲解ES6的解构
2016/08/03 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
微信小程序 setData的使用方法详解
2017/04/20 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
Python实现对百度云的文件上传(实例讲解)
2017/10/21 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
python3.5安装python3-tk详解
2019/04/26 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
简单叙述一下MYSQL的优化
2016/05/09 面试题
应届毕业生求职信范例分享
2013/12/17 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
会计电算化实训报告
2014/11/04 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
分析Java中Map的遍历性能问题
2021/06/26 Java/Android
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python