Mar*_*ark 7 python python-imaging-library
我试图将pyBarcode的输出转换为PIL图像文件,而无需先保存图像.首先,pyBarcode生成一个像这样的图像文件:
>>> import barcode
>>> from barcode.writer import ImageWriter
>>> ean = barcode.get_barcode('ean', '123456789102', writer=ImageWriter())
>>> filename = ean.save('ean13')
>>> filename
u'ean13.png'
Run Code Online (Sandbox Code Playgroud)
如您所见,我不希望图像实际保存在我的文件系统上,因为我希望将输出处理为PIL图像.所以我做了一些修改:
i = StringIO()
ean = barcode.get_barcode('ean', '123456789102', writer=ImageWriter())
ean.write(i)
Run Code Online (Sandbox Code Playgroud)
现在我有一个StringIO文件对象,我希望PIL"读取"它并将其转换为PIL图像文件.我想使用Image.new或者Image.frombuffer这两个函数都要求我输入一个大小......不能通过条形码StringIO数据来确定大小吗? Image.open在他们的文档中说明:
您可以使用字符串(表示文件名)或文件对象.在后一种情况下,文件对象必须实现read,seek和tell方法,并以二进制模式打开
StringIO实例也不是文件对象吗?如何将其作为二进制文件打开?
Image.open(i, 'rb')
>>> Image.open(i, 'rb')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/mark/.virtualenvs/barcode/local/lib/python2.7/site-packages/PIL/Image.py", line 1947, in open
raise ValueError("bad mode")
ValueError: bad mode
Run Code Online (Sandbox Code Playgroud)
我确定我非常接近答案,我只需要别人的指导.先谢谢你们!
StringIO对象是文件对象.
但是,如果您正在使用cStringIO模块(模块的C优化版本StringIO),那么请注意,一旦您停止空StringIO实例,它就会针对只写进行优化,并且您不能像在输入文件中那样使用它,反之亦然.在这种情况下,只需重新初始化它:
i = StringIO(i.getvalue()) # create a cStringIO.StringO instance for a cStringIO.StringI instance.
Run Code Online (Sandbox Code Playgroud)
对于python版本(StringIO模块),只需再次尝试:
i.seek(0)
Run Code Online (Sandbox Code Playgroud)
你不是需要指定一个文件模式Image.open()的呼叫; 除非i是字符串,否则在任何情况下都会被忽略:
img = Image.open(i)
Run Code Online (Sandbox Code Playgroud)
以下内容对我有用,可以将输出转换为 PIL 图像文件:
import barcode
ean = barcode.get('ean13', '123456789102', writer = barcode.writer.ImageWriter())
image = ean.render()
Run Code Online (Sandbox Code Playgroud)
这种方式不需要StringIO