让你的电脑也识得二维码图片(一)

开始

昨日突发奇想,想在电脑上实现二维码图片的识别解码。因此查了点资料决定用python的pyzbar包写一个二维码解码的脚本。 首先pip安装pyzbar库:

pip install pyzbar

掏出python写下了如下程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import os
import webbrowser
from PIL import Image
from pyzbar import pyzbar

def decode_qr_code(code_img_path):
if not os.path.exists(code_img_path):
raise FileExistsError(code_img_path)
return pyzbar.decode(Image.open(code_img_path), symbols=[pyzbar.ZBarSymbol.QRCODE])

if __name__ == "__main__":
src = input("输入二维码路径:")
results = decode_qr_code(src)
if len(results):
if "http://" in results[0].data.decode("utf-8") or "https://" in results[0].data.decode("utf-8"):
webbrowser.open(results[0].data.decode("utf-8"))
print(results[0].data.decode("utf-8"))
else:
print("Can not recognize.")

嗯,还不错,只需要运行python脚本输入二维码路径就可以打开识别了,而且做了分类,对于纯文本直接打印,对于网址则使用webbrowser使用默认浏览器打开网址。

改进

虽然我觉得这个脚本还不错啦,可以实现二维码图片的识别解码了,但我觉得这个输入二维码图片路径不大方便(或许是我懒),还有就是每次运行都得找到这个python脚本,着实不大方便。 嗯,得想个办法无需找到python脚本就能直接执行,总不能放个python脚本在桌面吧太丑了。 突然我灵机一动想到了我们的右键菜单栏:

右键菜单栏

这玩意儿多方便啊,只需要找到二维码图片,然后右击打开菜单栏,然后执行脚本文件就好啦。 立马动手查找资料,看到右键菜单栏添加项需要修改注册表,嗯,按下win+r 输入regedit回车打开注册表编辑器,到计算机\HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\目录下新建一个项叫Recognize Qrcode(自己取的名字,会显示到右键菜单栏中,上图中有),然后再在Recognize Qrcode/下新建一个command项,双击名称修改其中的数值数据,起初我填的是(注意是英文 "):D:\Python\test\demo.py "%1"

退出注册表编辑器后右键图片确实可以出现新添加的Recognize Qrcode,但单击执行却提示:

哦豁,无法直接执行python脚本,查阅网上资料发现,可以写个.bat文件然后去执行python脚本,即将之前填写的数值数据改成(注意是英文 "):D:\Python\test\demo.bat "%1"

然后偷学一点批处理命令写了个.bat文件:

1
2
3
4
5
@echo off
cd d:\Python\test
d:
python demo.py %*
pause

然后再次测试,果然能够成功通过右键菜单运行python脚本了。

再改进

虽然解决了去寻找python脚本的麻烦,但是还是得手动输入图片路径,这还是好麻烦,能不能在右键菜单运行python脚本的时候直接获取到图片的路径呢。 好的,继续查资料,查了半天还是把目光盯到了右键上,经过一番搜索,发现:

右键的同时系统是会提取到图片的路径的

呦吼,这不就是我想要的嘛。接着开始修改代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import os
import sys
import webbrowser
from PIL import Image
from pyzbar import pyzbar

def decode_qr_code(code_img_path):
if not os.path.exists(code_img_path):
raise FileExistsError(code_img_path)
return pyzbar.decode(Image.open(code_img_path), symbols=[pyzbar.ZBarSymbol.QRCODE])

if __name__ == "__main__":
# 修改此处直接从系统得到了路径
src = sys.argv[1].replace('\\', '/').replace('"', '')
results = decode_qr_code(src)
if len(results):
if "http://" in results[0].data.decode("utf-8") or "https://" in results[0].data.decode("utf-8"):
webbrowser.open(results[0].data.decode("utf-8"))
print(results[0].data.decode("utf-8"))
else:
print("Can not recognize.")

测试运行成功。

再加个小功能

既然右键的时候系统已经能获取到路径了,这不给我们平时复制文件路径提供了一个新思路嘛,按照如上流程可以写一个在右键菜单栏中直接获取到文件路径的脚本,将获取到的路径发送到剪切板中(提一句windows的剪切板真香,建议win+v打开)。 为了测试这个想法,我在这个二维码解码的脚本中也加入了这个功能。 使用subprocess将获取到的路径发到剪切板中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os
import subprocess
import sys
import webbrowser
from PIL import Image
from pyzbar import pyzbar

def decode_qr_code(code_img_path):
if not os.path.exists(code_img_path):
raise FileExistsError(code_img_path)
return pyzbar.decode(Image.open(code_img_path), symbols=[pyzbar.ZBarSymbol.QRCODE])

if __name__ == "__main__":
# 添加此处将获取到的文件路径发送到剪切板
cmd = 'echo ' + sys.argv[1].strip().replace('"', '') + '|clip'
subprocess.check_call(cmd, shell=True)
# 修改此处直接从系统得到了路径
src = sys.argv[1].replace('\\', '/').replace('"', '')
results = decode_qr_code(src)
if len(results):
if "http://" in results[0].data.decode("utf-8") or "https://" in results[0].data.decode("utf-8"):
webbrowser.open(results[0].data.decode("utf-8"))
print(results[0].data.decode("utf-8"))
else:
print("Can not recognize.")

经测试完美实现此功能。

最后

这个二维码识别功能还比较简陋,只能识别单张二维码,且图片必须保存到本地,还有较大的改进空间。 有更新想法的可以在评论提出。 源码及后续改进将发布在Gitee


让你的电脑也识得二维码图片(一)
https://hwh-2019.github.io/2022/11/18/让你的电脑也识得二维码图片-一/
作者
HWH
发布于
2022年11月18日
许可协议