【发布时间】:2012-12-19 12:54:42
【问题描述】:
我正在尝试将 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'
正如您在上面看到的,我不希望图像实际保存在我的文件系统上,因为我希望将输出处理成 PIL 图像。所以我做了一些修改:
i = StringIO()
ean = barcode.get_barcode('ean', '123456789102', writer=ImageWriter())
ean.write(i)
现在我有一个 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
我确定我非常接近答案,我只需要有人指导。提前谢谢各位!
【问题讨论】:
-
你有没有试过省略
Image.open中的第二个参数(我的意思是,在默认模式下打开)? -
你有没有
.seek(0)回到StringIO的开头?然后,正如 PauloScardine 建议的那样,省略第二个参数。可能也想尝试使用io.BytesIO。 -
谢谢大家! seek(0) 并省略第二个参数就可以了!
标签: python python-imaging-library