python如何通过列表转换为二维码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python如何通过列表转换为二维码?相关的知识,希望对你有一定的参考价值。

我有一个列表all=[1,1,1,1,1,1,1,0,1,0,1,1,0,0,......共441个0和1]
现在想做一个21*21的二维码其中,0为白色,1为黑色.

我用 Pillow 的 Image 模块试了一下,生成图片如下,尺寸是 210*210,21*21 的太小了显示效果不好,你可以改代码调整尺寸的 (我重新编辑了图片,划花了,不然会被识别成二维码被系统吞掉)




代码如下:

#!/bin/python

from PIL import Image
import random
import math

# 44100 像素点总和,改为 441 最后尺寸就是 21*21 了
all = [ random.choice(range(0,2)) for i in range(44100) ]
row = int(math.sqrt(len(all)))
col = row
img = Image.new('RGB', (row, col), 'white')
i = 0

for x in range(0, row - 1):
for y in range(0, col - 1):
if all[i] == 1:
img.putpixel((x,y), 0)
i += 1

img.save('qr.jpeg')
img.close()

追问

我试了一下,有点bug,二维码错位了,我研究了一下,我把for循环中范围row-1和col-1换成row和col就正常了

追答

对,你是对的,一时没注意 range 的范围是 [x, y), 不包括结尾

参考技术A Python有好几个模块(例如qrcode、MyQR)可以一两行代码就生成一个二维码,也有解码二维码以了解原始字符串的代码,简单方便。下面介绍qrcode模块和MyQR模块。
一、qrcode模块
import qrcode
img=qrcode.make("略旅人率略")
img.save("test.jpg")123123qrcode.make()括号里可放网址链接、中文字符串、英文字符串。
二、MyQR模块样例如下:
from MyQR import myqr#myqr.run('dfdf') #可以只带一个参数生成二维码,也可以指定多个参数myqr.run(words='dfdf',picture='E:/资料/壁纸/壁纸-柴犬.png',version=5,level="H",colorized=True,contrast=1.0,brightness=1.0)12341234。

如何在python中将一维值列表转换为0和1的二维网格[重复]

【中文标题】如何在python中将一维值列表转换为0和1的二维网格[重复]【英文标题】:How to transform 1D list of values to 2D grid of 0's and 1's in python [duplicate] 【发布时间】:2020-05-10 02:36:49 【问题描述】:

我想获取一个值列表并将它们转换为 0 和 1 的表(2D 列表),源列表中的每个唯一数字有一列,原始行数相同。如果该列索引与原始值 1 匹配,则每行将有一个 1。

我有完成这项任务的代码,但我想知道是否有更好/更快的方法来完成它。 (与下面的简化集相比,实际数据集有数百万个条目)

示例输入:

value_list = [1, 2, 1, 3, 6, 5, 4, 3]

期望的输出:

output_table = [[1, 0, 0, 0, 0, 0],
                [0, 1, 0, 0, 0, 0],
                [1, 0, 0, 0, 0, 0],
                [0, 0, 1, 0, 0, 0],
                [0, 0, 0, 0, 0, 1],
                [0, 0, 0, 0, 1, 0],
                [0, 0, 0, 1, 0, 0],
                [0, 0, 1, 0, 0, 0]]

当前解决方案:

value_list = [1, 2, 1, 3, 6, 5, 4, 3]
max_val = max(value_list)

# initialize to table of 0's
a = [([0] * max_val) for i in range(len(value_list))]

# overwrite with 1's where required
for i in range(len(value_list)):
    j = value_list[i] - 1
    a[i][j] = 1

print(f'a = ')
for row in a:
    print(f'row')

【问题讨论】:

如果您要处理大量数据,则可能值得使用 NumPy。它是什么样的数据? 它来自一个文本文件(我在另一个步骤中将其提取到一维值列表中)。源数据中的所有数字都是整数。 这基本上是one-hot编码。如果你可以使用 NumPy,你的生活会更轻松。我已经标记了一个副本供您查看 如果您正在寻找减少处理(甚至可能是内存),可以将numpy.ndarray 子类化,这样底层数据只是value_list 的内容,但返回的视图看起来像output_table import numpy as np; a = np.array([1, 2, 1, 3, 6, 5, 4, 3]); b = np.arange(1,a.max()+1); c = 1 * (a[:,None] == b[None,:]) 【参考方案1】:

你可以这样做:

import numpy as np

value_list = [1, 2, 1, 3, 6, 5, 4, 3]

# create matrix of zeros
x = np.zeros(shape=(len(value_list), max(value_list)), dtype='int')

for i,v in enumerate(value_list):
    x[i,v-1] = 1

print(x)

输出:

[[1 0 0 0 0 0]
 [0 1 0 0 0 0]
 [1 0 0 0 0 0]
 [0 0 1 0 0 0]
 [0 0 0 0 0 1]
 [0 0 0 0 1 0]
 [0 0 0 1 0 0]
 [0 0 1 0 0 0]]

【讨论】:

您可以在创建初始数组x 后,通过x[np.arange(len(value_list)), np.array(value_list) - 1] = 1 不循环地同时分配所有行。【参考方案2】:

你可以试试这个:

dummy_list = [0]*6
output_table = [dummy_list[:i-1] + [1] + dummy_list[i:] for i in value_list]

输出:

output_table = [[1, 0, 0, 0, 0, 0],
                [0, 1, 0, 0, 0, 0],
                [1, 0, 0, 0, 0, 0],
                [0, 0, 1, 0, 0, 0],
                [0, 0, 0, 0, 0, 1],
                [0, 0, 0, 0, 1, 0],
                [0, 0, 0, 1, 0, 0],
                [0, 0, 1, 0, 0, 0]]

【讨论】:

以上是关于python如何通过列表转换为二维码?的主要内容,如果未能解决你的问题,请参考以下文章

Python中如何将二维列表转换成一维列表

将二维列表中的字符转换为int值python

使用生成器以及递归实现二维乃至多维列表转换成一维列表(python实现)

如何在 Python 中保存二维数组(列表)?

在python中,我应该如何使用函数将文件读入二维列表后,不要让二维列表为空

如何在python中创建二维列表