Emmmmm...最近学的东西有点杂 不管了 先记录下
关于二维码的生成,python的生成方式及其简单粗暴,只需要调用qrcode库即可。先放下代码。
import qrcode
import os
def create_qr(self, url, qrcodename):
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.ERROR_CORRECT_H,
box_size=10, # pixel of each box
border=1, # round blocks
)
qr.add_data(url)
qr.make(fit=True)
img = qr.make_image()
img = img.convert("1")
img.show()
img.save(os.getcwd() + '/' + qrcodename + '.png', quality=100)
解释下上面在创建二维码的过程中的参数:
version:代表二维码的版本,有1-40,随着版本的升高,二维码所能存储的信息也越多,二维码也越大,version1为 270x270
error_correction:二维码的容错等级,有L、M、Q、H,等级依次升高,容错率也越来越高,所占用的字节数也越来越高
box_size:即每个格子所包含的像素数,默认为10
border:二维码边缘的包含几个格子,即生成二维码后的白边宽度
关于具体的信息结构可以参照上图。
由于python的库对二维码可以控制的变量过少,不能控制其中的编码信息,在网上查找以后以为有关于二维码的编码代码,想要实现细节的更改二维码(例如改变其中的几个比特)几乎只能自己绘制二维码,但编程极为复杂。
思考后,发现了如下的方式。由于我们只想更改其中的几位,我们可以利用python对生成好的二维码进行处理,手动涂黑其中的白块,实现编码。具体如下所示:
对于红线划分出来的格子即代表着0和1,我们可以通过改变其颜色来改变其代表的含义。
在更改的过程中,我们就需要用到了python的图像处理。(自己画的红线,丑点见谅= =)
目前python有的图像处理库主要为一下几种:opencv, PIL, matplotlib
种类繁多,其中PIL是一些基本库,想要对图像进一步处理可以考虑opencv或者matplotlib
关于PIL的详细函数可以参照:https://blog.csdn.net/zhangziju/article/details/79123275
本次主要用到了其中的几个类来进行处理。
首先读取二维码:
def read_qr(self, path):
im = Image.open(path)
pix = im.load()
im为图像的对象,pix中存储的是该图像的数组。其中 pix[x, y] 代表的就是坐标(x,y)上的颜色值。由于二维码只有黑色和白色,所以其值只有255和0两种。
接下来对其中的块进行上色:
def find_block(x, y, pix):
for i in range(10):
for j in range(10):
pix[x + i, y + j] = not pix[x + i, y + j]
由于我们生成时每个格子是10像素,所以我们需要将以(x,y)为左上定点的格子的像素进行变换,这里我对其进行了反转变换,即黑色变为白色或者白色变为黑色。
我们可以利用opencv的异或函数对这两幅图进行异或处理,看出其中的不同,代码如下:
import os
import cv2
def find_difference():
handle_paths = []
src_paths = []
for i in range(4):
path1 = os.getcwd() + '/' + 'handled' + str(i) + '.png' # 处理后的二维码
path2 = os.getcwd() + '/' + 'src' + str(i) + '.png' # 原始二维码
handle_paths.append(path1)
src_paths.append(path2)
for i in range(4):
src = cv2.imread('./src' + str(i) + '.png')
handle = cv2.imread('./handled' + str(i) + '.png')
bitwiseXor = cv2.bitwise_xor(src, handle) # 异或函数
cv2.namedWindow('img')
cv2.imshow('img', bitwiseXor)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite('xor' + str(i) + '.png', bitwiseXor)
效果如下:
对二维码的图像处理到此就结束了。