加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Python在Shell中打印二维码

(2016-12-30 17:58:49)
标签:

linux

python

qr

二维码

pil

分类: Linux

原创作品欢迎转载,转载时请注明转载地址


在Shell中打印二维码

使用Python的PIL图像库读取图片的像素点值然后在shell窗口中打印特殊字符组成二维码。

如下图:在二维码的构成中相邻上下两个点之间只有四种构成情况。

http://note.youdao.com/yws/api/personal/file/C83FC993A1B84BB18CE8F0F0A21822E7?method=download&shareKey=d78bdb220ad2649617f8468ee7c854fc

所以使用blocks = {'0':"█",'1':"▄",'2':"?",'3':" ",} 字典集表示这四种构成情况。

具体实现代码如下: 代码链接


from PIL import Image

IMG = "QR.jpg"
WIDTH = 430
HEIGHT = 430
OUTPUT = "out.txt"

#构成的字典集
blocks = {'0':"█",'1':"▄",'2':"?",'3':" ",}
def selc_cub(num):
    return blocks.get(num);

def draw_QR():
    global sel_num
    im = Image.open(IMG)
    im = im.resize((WIDTH,HEIGHT), Image.NEAREST)

    txt = ""
    #遍历整张图片
    for i in range(0,HEIGHT-20,20):        
        for j in range(0,WIDTH,10):            
            if (im.getpixel((j+5,i+15)) > 128 ):
                sel_num = 2;
                #txt += " ";
            else:
                sel_num = 0;
                #txt += "#";
            if (im.getpixel((j,i)) > 128 ):
                sel_num = sel_num + 1;
                #txt += " ";
            txt += selc_cub(str(sel_num))

            
            #txt += get_char(*im.getpixel((j,i)))
        #print txt
        txt += '\n'

    print txt
    print "Done"

print "  "
draw_QR()

原始图像见下图
http://note.youdao.com/yws/api/personal/file/CA7DC9DC57D747139F4E2FDC93105D70?method=download&shareKey=6abe7a946a5c1844b884b7158270934d

运行程序之后在shell中打印的效果如下图

http://note.youdao.com/yws/api/personal/file/9E951943F8FD47C5A6F0877D5832E22E?method=download&shareKey=a9d10f25152fdc6a925a43eb1ae103f4

可能是字符编码的关系导致字符间间隔较大所以在shell中打印出来的二维码使用二维码扫描工具识别不了的。

但是在windows的Python IDE的shell窗口打印出来的二维码倒是很标准这是和显示窗口的字符集有关。 http://note.youdao.com/yws/api/personal/file/A9D509130D2B410996E89E1EEF744711?method=download&shareKey=15678a4aeeede1c5bc3920bc2a32d904

使用python里面向shell输出彩色字符串模式打印“无缝”二维码

首先请参考这个链接 python里面向shell输出彩色字符串 按需求格式化所要打印的字符串


atrr = 7
fore = 37
back = 47
color_block = "\x1B[%d;%d;%dm" % (atrr,fore,back)
atrr = 0
fore = 0
back = 0
color_none = "\x1B[%d;%d;%dm" % (atrr,fore,back)

for loop in range(0,len(QR_Tab)):
    if QR_Tab[loop] == '#' :
        tmp_text = "%s  \x1B[0m" %(color_block)
    elif QR_Tab[loop] == ' ' :
        tmp_text = "%s  \x1B[0m" %(color_none)
    else:
        tmp_text = "\n"
        
    print_tex = print_tex + tmp_text

代码实现如下: 代码链接


from PIL import Image

IMG = "QR.jpg"
WIDTH = 430
HEIGHT = 430
OUTPUT = "out.txt"

def derw_QR(QR_Tab):
    global tmp_text
    global print_tex
    tmp_text = ""
    print_tex = ""
    
    atrr = 7
    fore = 37
    back = 47
    color_block = "\x1B[%d;%d;%dm" % (atrr,fore,back)
    atrr = 0
    fore = 0
    back = 0
    color_none = "\x1B[%d;%d;%dm" % (atrr,fore,back)
    
    for loop in range(0,len(QR_Tab)):
        if QR_Tab[loop] == '#' :
            tmp_text = "%s  \x1B[0m" %(color_block)
        elif QR_Tab[loop] == ' ' :
            tmp_text = "%s  \x1B[0m" %(color_none)
        else:
            tmp_text = "\n"
            
        print_tex = print_tex + tmp_text
    #print_tex = "%s1\x1B[0m%s2\x1B[0m" %(color1,color2)
    print print_tex
        
            
            

def get_imgdata():
    global sel_num
    global off_set 
    off_set = 0
    im = Image.open(IMG)
    im = im.resize((WIDTH,HEIGHT), Image.NEAREST)

    txt = ""        
    
    for i in range(30,HEIGHT-10,10):        
        for j in range(30,WIDTH-10,10):
            if (im.getpixel((j-5,i-5)) > 128 ):
                txt += "#";
            else:
                txt += " ";            
            #txt += get_char(*im.getpixel((j,i)))
        #print txt
        txt += '\n'
    return txt

#    print txt

derw_QR(get_imgdata())

实现效果如下:

http://note.youdao.com/yws/api/personal/file/CB7F482F3D5446AC9A0F7AB4A61FD935?method=download&shareKey=8dfa7a95191131f7ac04db891e1decc5

效果还是蛮“喜人”的,在shell窗口中完美无缝打印。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有