前言
最近看到了 掘金创意开发大赛, 我脑子里当场就想出来题材了, 二维码!
二维码可以说是我们生活中最常用的了, 收付款, 扫码登陆, 信息登记.... 特别是这三年疫情, 去哪不得扫个健康宝, 我都快看吐了, 那么为什么我们不来秀一秀自己的创意, 整一些花式的二维码呢? 也算是爱护眼睛了(避免审美疲劳);
展示
二话不说, 先上一手效果图
实现
哈哈, 看了上面的展示图, 大家是不是也想赶紧秀出自己的二维码了呢; 赶快动手操作起来吧, 实现起来很简单!
环境需求:
python3
依赖包:
pip install amzqr
ide使用
简单的玩只需要修改我下面备注的参数就可以了, 想看全部参数作用请看 github.com/x-hw/amazin…
import os
from amzqr import amzqr
if __name__ == '__main__':
words = "https://juejin.cn/pins"
version, level, qr_name = amzqr.run(
words=words, # 二维码的内容
version=1,
level='H',
picture="./zombie.png", # 需要镶入二维码的图片
colorized=False, # 是否上色 False(黑白) True(彩色)
contrast=1.0,
brightness=1.0,
save_name="zombie_qr.png", # 图片保存文件名
save_dir=os.getcwd() # 图片保存路径
)
命令行使用
# summary
amzqr Words
[-v {1,2,3,...,40}]
[-l {L,M,Q,H}]
[-n output-filename]
[-d output-directory]
[-p picture_file]
[-c]
[-con contrast]
[-bri brightness]
特别注意
由于这个包不支持中文, 所以如果想要生成中文内容的二维码需要做一点小小的修改
- 加入如下函数, 将
words
作为参数传进去转一下就好
def utf16to8(input_txt: str) -> str:
out = []
for idx in range(len(input_txt)):
ch = ord(input_txt[idx])
if 0x0001 <= ch <= 0x007f:
out.append(input_txt[idx])
elif ch > 0x07ff:
out.append(chr(0xE0 | (ch >> 12 & 0x0F)))
out.append(chr(0x80 | (ch >> 6 & 0x3F)))
out.append(chr(0x80 | (ch >> 0 & 0x3F)))
else:
out.append(chr(0xC0 | (ch >> 6) & 0x1f))
out.append(chr(0x80 | (ch >> 0) & 0x3f))
return ''.join(out)
words = utf16to8("每当我看见花瓣脱离花蕊慢慢枯萎")
- 使用ide进入
run
方法的源码将判断支持字符的方法注掉
- 完事啦!
原理思考
实现的话需要理解二维码生成的原理, 然后通过算法找到非内容覆盖的区域, 再对图片进行像素替换;
大家感兴趣的话可以看看这个实现research.swtch.com/qr/draw/; 它可以展示出二维码图片中的所有的可控像素, 以及随机/抖动/只展示数据占用的像素区域, 很牛逼!
最后
期待一下各位掘友的精彩表演, 希望大家可以在评论区留下自己的花式二维码!
我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!