将pyBarcode输出转换为PIL图像文件

时间:2012-12-19 12:54:42

标签: 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'

正如您在上面所看到的,我不希望图像实际保存在我的文件系统上,因为我希望将输出处理为PIL图像。所以我做了一些修改:

i = StringIO()
ean = barcode.get_barcode('ean', '123456789102', writer=ImageWriter())
ean.write(i)

现在我有一个StringIO文件对象,我希望PIL“读取”它并将其转换为PIL图像文件。我想使用Image.newImage.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

我确信我非常接近答案我只需要别人的指导。先谢谢你们!

2 个答案:

答案 0 :(得分:7)

StringIO个对象文件对象。

但是,如果您使用的是cStringIO moduleStringIO模块的C优化版本),请注意,一旦您停止空的StringIO实例,它就会针对只写,你不能在输入文件中使用它,反之亦然。在这种情况下,只需重新初始化即可:

i = StringIO(i.getvalue())  # create a cStringIO.StringO instance for a cStringIO.StringI instance.

对于python版本(StringIO模块),只需重新开始:

i.seek(0)

需要为Image.open()电话指定文件模式;除非i是一个字符串,否则在任何情况下都会被忽略:

img = Image.open(i)

答案 1 :(得分:0)

以下工作方式可以将输出转换为PIL图像文件:

Get-ADUser 
-SearchBase "OU=11-something,DC=somethingelse,DC=somethingelser" 
-Filter {somefilters} -Properties name,mail
|Select-Object  Name,(mail).ToLower()
| Export-Csv -Path "D:\Path" 
 -Encoding UTF8 -NoTypeInformation

这种方式不需要StringIO