在Python中从外部程序的图像标准输出输出创建图像对象

时间:2013-04-12 15:50:05

标签: python image subprocess stringio

我有一个生成图片的程序,可以将它们保存到文件中,也可以在标准输出中打印出原始图像数据。我正在使用Python子进程模块来调用外部程序,捕获其stdout数据并从数据中创建Python图像对象。不过,我一直收到“无法识别图像文件”的错误。我是Python的这一部分的新手。如果你知道如何实现这个目标,能帮忙吗?这是我的代码:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
raw = p.stdout.read()
buff = StringIO.StringIO()
buff.write(raw)
buff.seek(0)
im = Image.open(buff)
im.show()

1 个答案:

答案 0 :(得分:3)

代码看起来很好。尝试添加行......

assert len(raw) >= 4
assert raw.startswith('\x89PNG')

...直接在线后...

raw = p.stdout.read()

...只是为了确保你能够获得有效的数据。

<强>更新

试试这个......

from subprocess import check_output
from cStringIO import StringIO
from PIL import Image

raw = check_output(cmd)
buff = StringIO(raw)
im = Image.open(buff)
im.show()

更新#2

问题是qrcode.exe中存在一个错误,当它写入stdout时,它会尝试将UNIX行结尾转换为DOS行结尾。

看起来这个bug可能已在以后的版本中得到修复。尝试:https://code.google.com/p/qrencode-win32/downloads/detail?name=qrcodegui_setup-3.3.1b.exe&can=1&q=qrencode-win32