前言
我们的生活已完全离不开一维码和二维码,本文会简单的介绍如果通过python的方法来生成它们
本文环境:
Python 2.7.10
pyBarcode==0.7
Pillow==5.1.0
一维码
安装
pip install pyBarcode
pip install Pillow
生成到文件中
(env) python manage.py shell
Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from barcode.writer import ImageWriter
>>> from barcode.codex import Code39
>>> from PIL import Image, ImageDraw, ImageFont, ImageWin
>>> imagewriter = ImageWriter()
>>> ean = Code39("1234567890", writer=imagewriter, add_checksum=False)
>>> fullname = ean.save('image')
>>> img = Image.open(fullname)
>>> img.show()
首先我们导入Code39,pyBarcode支持多种方式,可用下面命令获取
>>> import barcode
>>> barcode.PROVIDED_BARCODES
['code39', 'ean', 'ean13', 'ean8', 'gs1', 'gtin', 'isbn', 'isbn10', 'isbn13', 'issn', 'jan', 'pzn', 'upc', 'upca']
add_checksum
表示是否将checksum添加到code中
ean.save()
参数为文件名,这个文件名可以是绝对路径或者相对路径。
最后,调用了PIL的Image来显示这个生成的图片,如下:
生成到StringIO中
>>> from StringIO import StringIO
>>> i = StringIO()
>>> ean = Code39("0987654321", writer=imagewriter, add_checksum=False)
>>> ean.write(i)
>>> f = StringIO(i.getvalue())
>>> img1 = Image.open(f)
>>> print 'save to StringIO and show with image format'
save to StringIO and show with image format
>>> img1.show()
图片打开时是从StringIO中把内容读出来。
参数配置
从上面图片效果看,文字离一维码距离实在太远了,需要调整一下。差了一下,基本的Writer有下面选项,还有继承类的SVGWritr和ImageWriter等,对我的需要来说,基本的就够了,可以通过调整text_distance和font_size来调整效果
有两种方法可以将这个选项参数传递给Writer
All writer take the following options (specified as keyword arguments to Barcode.save(filename, option=value) or set via Writer.set_options(option=value)).
实际使用中,Writer.set_options并没有生效,不确定是否我的方法用错了。
options = {"text_distance":1, "font_size":12}
imagewriter = ImageWriter()
imagewriter.set_options(options=options)
改用Barcode.save方法
options = {"text_distance":1, "font_size":12}
ean = Code39(filename, writer=imagewriter, add_checksum=False)
ean.save(fullpath,options=options)
图片效果如下
详细内容可查看https://pythonhosted.org/pyBarcode/writers/index.html
更改编码类型
生成的二维码太密了,手机扫描很麻烦 待续......