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

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


开始

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

pip install pyzbar

掏出python写下了如下程序:

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文件:

@echo off
cd  d:\Python\test
d:
python demo.py %* 
pause

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

再改进

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

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

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

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将获取到的路径发到剪切板中:

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.")

经测试完美实现此功能。

最后

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鞠杉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值