【问题标题】:Create image object from image stdout output of external program in Python在 Python 中从外部程序的图像标准输出创建图像对象
【发布时间】:2013-04-05 05:42:29
【问题描述】:

我有一个程序可以生成图片并将它们保存到文件或在标准输出中打印出原始图像数据。我正在使用 Python 子进程模块来调用外部程序,捕获其标准输出数据并从数据中创建 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()

【问题讨论】:

  • 你的子进程输出图像的格式是什么?
  • PNG。对不起。我应该提到这一点。

标签: python image subprocess stringio


【解决方案1】:

代码对我来说看起来不错。尝试添加行...

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 中有一个错误,当它写入标准输出时,它会尝试将 UNIX 行结尾转换为 DOS 行结尾。

看起来该错误可能已在更高版本中得到修复。试试看:https://code.google.com/p/qrencode-win32/downloads/detail?name=qrcodegui_setup-3.3.1b.exe&can=1&q=qrencode-win32

【讨论】:

  • 好的。我这样做了。这些断言没有错误。如果它有助于发现某些东西,我会将原始输出打印到控制台。是这个(截断): ëPNG → IHDR ô ô☺ ó₧▬╕ ☻ IDATHë▌û┴═Σ ♀à↔qαûi ë6╕╤R╥@2i`hë←m ╤@σ►┼√╚ƒ╒Ä┤ ↨|²Qä&▀H æ♠ ½|N▲á\ε\‼^%,Ü┼¥C╠CΣÜh▬▓9frτDê*fïcÄ%░┌ñ♀yP&ƒ↨G≤Wn=♀·═╔
  • 如果你将整个原始变量转储到一个文件中,比如open('test.png', 'wb').write(raw),然后用图像查看器打开它呢?
  • 这确实有效。我已经尝试过了,所以我确信外部文件生成的文件是正确的。我只是想避免先将文件保存到硬盘驱动器然后加载它以保存它的步骤。我需要每秒执行 30 次,所以最好在内存中执行此操作。 ;)
  • 我唯一能想到的另一件事是,由于某种原因,您的 PIL 安装不包含 PNG 解码器,尽管我不确定如何检查 - 如果您这样做,它是否也会失败im = Image.open('test.png')你刚刚保存的图片?
  • 当我这样做时,它工作正常 - 没有错误。奇怪的。我想我会先将图像保存到文件中,然后再次加载。每秒可以完成 30 次。这只是丑陋的工程。不过,感谢您的帮助!
猜你喜欢
  • 2011-03-08
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2017-12-29
  • 2014-10-16
  • 1970-01-01
相关资源
最近更新 更多