文章目录
-
- 前言
- 1. 二维码
- 2. MyQR
- 3. qrcode
前言
今天下午无聊,突发奇想想玩玩二维码,于是就结合着上学期学的标识技术,用Python制作了一下二维码。
1. 二维码
二维码 ( 2 − D i m e n s i o n a l (2-Dimensional (2−Dimensional B a r c o d e ) Barcode) Barcode),又称二维条形码。它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形来记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。
一维条形码,就是我们日常所说的条形码 ( B a r c o d ) (Barcod) (Barcod),常见于食品包装上。它是将宽度不等的多个黑条和空白,按一定的编码规则排列,用以表达一组信息的图形标识符。常见的一维条形码是由黑条(简称条)和白条(简称空)排成平行线图案。条形码可以标出物品的生产国、制造厂家、商品名称、生产日期以及图书分类号、邮件起止地点、类别、日期等信息。
通常一维条形码所能表示的字符集不过10个数字、26个英文字母及一些特殊字符,条码字符集最大所能表示的字符个数为128个ASCII字符,信息量非常有限。
二维码有其特定的字符集,每个字符占有一定的宽度,每种码具有一定的校验功能,同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。
二维条形码是在二维空间水平和竖直方向存储信息的条形码。它的优点是信息容量大,译码可靠性高,纠错能力强,制作成本低,保密与防伪性能好。
目前,世界上应用最多的二维条码符号有 A z t e c Aztec Aztec C o d e Code Code、 P D F 147 PDF147 PDF147、 D a t a M a t r i x DataMatrix DataMatrix、 Q R QR QR C o d e Code Code、 C o d e 16 K Code16K Code16K等。
常见的二维码为 Q R QR QR C o d e Code Code, Q R QR QR全称是 Q u i c k Quick Quick R e s p o n s e Response Response,是一个近几年来移动设备上超流行的一种编码方式。它的结构如下:
QR Code属于矩阵式二维条码,又称棋盘式二维条码。它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。
主要有以下特点:
1. 符号规格从版本1(21×21)到版本40(177×177),每提高一个版本,每边增加4个码元(即指构成QR码的方形黑白点);
2. 信息容量大:能存储7089个数字字符或4296个字母字符或2953个8位字节字符或1817汉字字符;
3. 纠错能力强:即使部分编码变脏或破损,也可以恢复数据。L级约可纠错7%的数据码字,M级约可纠错15%的数据码字,Q级约可纠错25%的数据码字,H级约可纠错30%的数据码字;
4. 可以从任意方向读取:QR码可以从360°任一方向均可快速读取。通过QR码中的三处定位图案,可以帮助QR码不受背景样式的影响,实现快速稳定的读取。
上述材料来源于《物联网技术基础教程》/李联宁编著.清华大学出版社,2012.6
2. MyQR
有关更详细MyQR的操作,可以参阅官方文档。
MyQR可以生成常见的二维码、艺术二维码(黑白或彩色), 动态二维码(黑白或彩色),安装命令如下:
pip install MyQR
参数 | 类型 | 说明 |
---|---|---|
w o r d s words words | s t r str str | 二维码的内容 |
v e r s i o n version version | i n t int int | 1 − 40 1-40 1−40,控制二维码的大小,默认是 1 1 1,即 21 × 21 21\times21 21×21 |
l e v e l level level | s t r str str | ′ L ′ , ′ M ′ , ′ Q ′ , ′ H ′ 'L','M','Q','H' ′L′,′M′,′Q′,′H′,选一个,默认是 L L L |
p i c u t r e picutre picutre | s t r str str | 图片的文件名,默认为空,即生成的二维码是普通的二维码 |
c o l o r i z e d colorized colorized | b o o l bool bool | 默认是 F a l s e False False,即生成的二维码是黑白的 |
c o n s t r a s t constrast constrast | f l o a t float float | 对比度,默认是 1.0 1.0 1.0 |
b r i g h t n e s s brightness brightness | f l o a t float float | 亮度,默认是 1.0 1.0 1.0 |
s a v e _ n a m e save\_name save_name | s t r str str | 输出的文件名,比如 ′ e x a m p l e . p n g ′ 'example.png' ′example.png′ |
s a v e _ d i r save\_dir save_dir | s t r str str | 输出的文件路径,默认为当前路径 |
代码如下:
if __name__ == '__main__':
version, level, qr_name = myqr.run(
words='https://blog.csdn.net/qq_42730750',
version=1,
level='H',
picture='./XKD.gif',
colorized=True,
contrast=1.0,
brightness=1.0,
save_name='test4.gif',
save_dir=os.getcwd()
)
print(version)
print(level)
print(qr_name)
这是我生成的几个二维码:
MyQR确实是挺好用的,唯一的缺点就是,不支持中文!!!没错,是不是有点遗憾,它只支持以下字符:
- 数字 0 到 9
- 大小写的英文字母
- 常用英文标点符号和空格
· , . : ; + - * / \ ~ ! @ # $ % ^ & ` ' = < > [ ] ( ) ? _ { } | and (space)
3. qrcode
有关更详细qrcode的操作,可以参阅官方文档。
qrcode的功能虽稍逊于MyQR,但是它支持中文字符,且能生成矢量图,安装命令如下:
pip install qrcode
参数 | 类型 | 说明 |
---|---|---|
v e r s i o n version version | i n t int int | 1 − 40 1-40 1−40,控制二维码的大小,默认是 1 1 1,即 21 × 21 21\times21 21×21 |
e r r o r _ c o r r e c t i o n error\_correction error_correction | c o n s t a n t s constants constants | 用于QR码的错误校正,默认 q r c o d e . c o n s t a n t s . E R R O R _ C O R R E C T _ L qrcode.constants.ERROR\_CORRECT\_L qrcode.constants.ERROR_CORRECT_L,即 L L L级 |
b o x _ s i z e box\_size box_size | i n t int int | 控制QR码的每个格子有多少像素,默认为10 |
b o r d e r border border | i n t int int | 控制边框(空白区)的格子宽度,默认为4 |
f i l l _ c o l o r fill\_color fill_color | s t r str str | 二维码的绘制色,默认为 ′ b l a c k ′ 'black' ′black′ |
b a c k _ c o l o r back\_color back_color | s t r str str | 二维码的背景色,默认为 ′ w h i t e ′ 'white' ′white′ |
代码如下:
def mergeImg(img1, img2, flag=True):
""" 合并图像 :param img1: :param img2: :param flag: True 表示将logo居中, False 表示将logo作为背景图 :return: """
img1_w, img1_h = img1.size
if flag:
img2_w = int(img2.size[0] / 3)
img2_h = int(img2.size[1] / 3)
# 缩放logo
img2 = img2.resize(size=(img2_w, img2_h), resample=Image.ANTIALIAS)
# 将logo居中显示
img1.paste(im=img2, box=(int((img1_w - img2_w) / 2), int((img1_h - img2_h) / 2)))
img1.save('./test8.png')
else:
img2 = img2.resize(size=(img1_w, img1_h), resample=Image.ANTIALIAS)
# 两张图片的size和mode要一致
# 计算公式为out = image1 * (1.0 - alpha) + image2 * alpha
# 这里的背景色就是一种干扰了, 如果将二维码的透明度设置过高会识别不出来
out_img = Image.blend(img1, img2, alpha=0.3)
out_img.save('./test9.png')
if __name__ == '__main__':
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10,
border=4,
)
qr.add_data('这是我的博客地址: https://blog.csdn.net/qq_42730750')
qr.make(fit=True)
# black green purple orange pink white blue
# make_image() 返回的是一个PilImage对象
# 可以使用pillow对它进行图像处理相关的操作
# img1 = qr.make_image(fill_color="#8A2BE2", back_color="white")
img1 = qr.make_image(fill_color="orange", back_color="white").convert('RGB')
# img1.show()
# img1.save('./test6.png')
img2 = Image.open('./cutcamera.png').convert('RGB')
mergeImg(img1, img2, flag=True)
这是我生成的几个二维码:
有关更多 P I L . I m a g e PIL.Image PIL.Image的操作,请参考官方文档。