博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python小工具——二维码生成_解读器
阅读量:2580 次
发布时间:2019-05-11

本文共 6618 字,大约阅读时间需要 22 分钟。

思路:

使用qrcode和pyzbar这两个包进行二维码的生成和解码。

本文介绍的例子还保留了zxing包进行二维码解码的函数,可以通过改变“打开图片”按钮的函数来进行切换。

通过选择是否添加图标来决定是否在二维码中嵌入图片。

PS,

网上给的很多二维码的解码包是zbar,但是zbar只适用于Python2,在Python3环境中并不试用。

同时,pyzbar只支持QR码和条形码(一维码),像矩阵码等二维码暂不支持。而zxing却可以支持多种二维码,但使用zxing包进行解析时,由于其解析的结果是直接输出字符串而不是bytes,且它是给予java的zxing包来进行解析的,zxing无法解读包含中文的二维码。

无论是pyzbar还是zxing,都无法直接解析RGBA格式的图片。

 

按钮作用:

打开图片:打开二维码图片,并同时解析二维码图片。

另存图片:保存当前的二维码图片

选择图标:选择想要嵌入到二维码中的图标,同时在右上方显示图标。

生成二维码:使用文本框中的文本生成二维码并显示。

添加图标:是否将图标添加到生成的二维码当中。

 

代码:

#!/usr/bin/python # -*- coding: utf-8 -*-'''介绍:用于生成和解析二维码。作者:井盖上的青蛙邮箱:dcyywin8@163.com'''from tkinter import *from tkinter import filedialog,scrolledtext,ttk,messageboxfrom PIL import Image as PIL_Imagefrom PIL import ImageTkimport osimport pyzbar.pyzbar as pyzbarimport qrcodeimport reimport zxingimg_Show=''img_Canvas=''img_icon=''img_icon_Canvas=''win_main = Tk()win_main["background"] = "gray"win_main.geometry('1000x600')win_main.resizable(False,False)win_main.title("二维码构析器")frm_Tools=Frame(win_main)frm_Tools.place(x=0,y=0,width=200,height=600)lbl_Tools_Title=Label(frm_Tools,text='工具栏',borderwidth=2)lbl_Tools_Title.place(x=0,y=0,width=200,height=30)def cmd_btn_Tools_Open():    global img_Show,img_Canvas    file_name=filedialog.askopenfilename(filetypes=[('JPG Files','*.jpg'), ('GIF Files', '*.gif'), ('JPEG Files', '*.jpeg')])    if file_name=='':        return    img_Show=PIL_Image.open(file_name)    # 解析二维码    img_Show.save('temp.jpg')    zx = zxing.BarCodeReader()    data = ''    zxdata = zx.decode('temp.jpg')    print(zxdata.raw)    # 删除临时文件    os.remove('temp.jpg')    if zxdata:        data = zxdata.raw    else:        data='识别二维码出错:%s' % ('zxdata为空'+zxdata.raw)    if len(zxdata.points)==0:        data = '识别二维码出错:%s' % ('二维码维度错误'+str(zxdata.points))    else:        if zxdata.format=='QR_CODE':            width_temp, height_temp = zxdata.points[3]        elif zxdata.format=='DATA_MATRIX':            width_temp, height_temp = zxdata.points[2]        elif zxdata.format == 'EAN_13':            width_temp, height_temp = zxdata.points[1]        else:            data = '识别二维码出错:%s' % ('不识别类型'+str(zxdata.format))            width_temp, height_temp=(0,0)        if max(width_temp,height_temp)>=490:            zoom=max(width_temp,height_temp)/490            width_img, height_img = img_Show.size            # print(img_Show.size)            img_Show.thumbnail((int(width_img/zoom),int(height_img/zoom)))            # print(img_Show.size)        img_Canvas = ImageTk.PhotoImage(img_Show)        cnv_Pic.create_image(250,250,image=img_Canvas)    print(file_name)    stxt_Text.delete(0.0,END)    stxt_Text.insert(END,data)    returndef cmd_btn_Tools_Open_Pyzbar():    global img_Show, img_Canvas    file_name = filedialog.askopenfilename(        filetypes=[('JPG Files', '*.jpg'), ('GIF Files', '*.gif'), ('JPEG Files', '*.jpeg')])    if file_name == '':        return    img_Show = PIL_Image.open(file_name)    # img_Show.show()    # 解析二维码    barcodes = pyzbar.decode(img_Show)    print(barcodes)    if len(barcodes)>=1:        data = barcodes[0].data.decode("utf-8")        width_temp = barcodes[0].rect.width        height_temp = barcodes[0].rect.height        if max(width_temp, height_temp) >= 490:            zoom = max(width_temp, height_temp) / 490            width_img, height_img = img_Show.size            img_Show.thumbnail((int(width_img / zoom), int(height_img / zoom)))        img_Canvas = ImageTk.PhotoImage(img_Show)        cnv_Pic.create_image(250, 250, image=img_Canvas)    else:        data = '识别二维码出错:%s' % ('未检测到可识别二维码!')    print(data)    stxt_Text.delete(0.0, END)    stxt_Text.insert(END, data)    returnbtn_Tools_Open=Button(frm_Tools,text='打开图片',command=cmd_btn_Tools_Open_Pyzbar)btn_Tools_Open.place(x=0,y=30,width=100,height=30)def cmd_btn_Tools_Save():    file_name=filedialog.asksaveasfilename(defaultextension='.jpg',filetypes=[('JPG Files','*.jpg')])    img_Show.save(file_name)    # print(img_save)    returnbtn_Tools_Save=Button(frm_Tools,text='另存图片',command=cmd_btn_Tools_Save)btn_Tools_Save.place(x=100,y=30,width=100,height=30)def cmd_btn_Tools_ChooseIcon():    global img_icon,img_icon_Canvas    file_name = filedialog.askopenfilename(        filetypes=[('JPG Files', '*.jpg'), ('GIF Files', '*.gif'), ('JPEG Files', '*.jpeg')])    if file_name == '':        return    img_icon = PIL_Image.open(file_name)    width_img, height_img = img_icon.size    if max(width_img,height_img)>=280:        zoom = max(width_img, height_img) / 280        img_icon.thumbnail((int(width_img / zoom), int(height_img / zoom)))    img_icon_Canvas = ImageTk.PhotoImage(img_icon)    cnv_Pic_Icon.create_image(145, 145, image=img_icon_Canvas)    returnbtn_Tools_ChooseIcon=Button(frm_Tools,text='选择图标',command=cmd_btn_Tools_ChooseIcon)btn_Tools_ChooseIcon.place(x=0,y=60,width=100,height=30)def cmd_btn_Tools_Generate():    global img_Show,img_Canvas,img_icon    if var_cbox_AddIcon.get()==0:        str_generate=stxt_Text.get(0.0,END)        img_Show = qrcode.make(str_generate)        img_Show.save(r".\temp.jpg")        img_Canvas = ImageTk.PhotoImage(img_Show)        cnv_Pic.create_image(250, 250, image=img_Canvas)    else:        if img_icon=='':            messagebox.showinfo('提示','没有选择图标!')            return        code_maker = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H)        # 填入在二维码中保存的数据        str_generate = stxt_Text.get(0.0, END)        code_maker.add_data(str_generate)        code_maker.make(fit=True)        img_Show = code_maker.make_image()        img_Show = img_Show.convert('RGB')        # img_icon = PIL_Image.open(r'D:\\示例\\二维码\\图像嵌入.jpg')        code_width, code_height = img_Show.size        img_icon = img_icon.resize((60, 60), PIL_Image.ANTIALIAS)        # 将图标嵌入二维码当中        img_Show.paste(img_icon, (int((code_width-60) / 2), int((code_height-60) / 2)))        img_Show.save(r".\temp.jpg")        img_Canvas = ImageTk.PhotoImage(img_Show)        cnv_Pic.create_image(250, 250, image=img_Canvas)    returnbtn_Tools_Generate=Button(frm_Tools,text='生成二维码',command=cmd_btn_Tools_Generate)btn_Tools_Generate.place(x=100,y=60,width=100,height=30)var_cbox_AddIcon=IntVar()cbox_AddIcon=Checkbutton(frm_Tools,text="添加图标", variable=var_cbox_AddIcon)cbox_AddIcon.place(x=0,y=90,width=100,height=30)cnv_Pic=Canvas(win_main,background='white')cnv_Pic.place(x=200,y=0,width=500,height=500)frm_Pic=Frame(win_main)frm_Pic.place(x=700,y=0,width=300,height=500)cnv_Pic_Icon=Canvas(frm_Pic,background='white')cnv_Pic_Icon.place(x=5,y=5,width=290,height=290)stxt_Text=scrolledtext.ScrolledText(win_main)stxt_Text.place(x=200,y=500,width=800,height=100)win_main.mainloop()

 

转载地址:http://qszfd.baihongyu.com/

你可能感兴趣的文章
【Linux】Linux crontab 命令详解
查看>>
【Android】Android Service 服务
查看>>
【Android】GitHub Android 开源项目汇总
查看>>
【Android】Android模拟器无法上网问题
查看>>
【Linux】Linux中正则表达式
查看>>
【Linux】Linux中目录结构说明
查看>>
【Linux】Linux中Vim基础
查看>>
【Android平台】 Alljoyn学习笔记二 编译自带的demo的步骤
查看>>
【Android平台】 Alljoyn学习笔记三 开发环境的搭建和Building AllJoyn from Source for Android
查看>>
【Android平台】 Alljoyn学习笔记四 Android Core API参考
查看>>
【Alljoyn】Alljoyn学习笔记五 AllJoyn开源技术基础概念解析
查看>>
【Alljoyn】 Alljoyn学习笔记六 Alljoyn基本概念
查看>>
【Alljoyn】 Alljoyn学习笔记七 Alljoyn瘦客户端库介绍
查看>>
【Android】Activity生命周期
查看>>
【Android】Activity的四种launchMode
查看>>
【Android】Activity的task相关
查看>>
【Android】 Intent应用详解
查看>>
【Android】 Intent详解
查看>>
【Android】 常用的Intent
查看>>
Android中AsyncTask的简单用法
查看>>