我在使用PIL从STDIN读取png图像时遇到问题。当图像由PIL写入时,它全是scrambled,但如果我使用简单文件打开文件来写,则写入并关闭文件将被保存perfectly。
我有一个程序将png文件按序列转储到stdout,没有压缩,我使用python脚本读取该流,该脚本用于读取数据并在几乎每个png上执行一些例程。转储数据的程序会写入某个字符串来分隔PNG文件,字符串为"{fim:FILE_NAME.png}"
脚本类似于:
import sys
import re
from PIL import Image
png = None
for linha in sys.stdin:
if re.search('{fim:', linha):
fname = linha.replace('{fim:','')[:-2]
# writes data directly to file, works fine
#f = open("/tmp/%s" % fname , 'w')
#f.write(png)
#f.close()
# create a PIL Image from data and writes to disk, fails fine
im = Image.frombuffer("RGB",(640,480),png, "raw", "RGB", 0, 1)
#im = Image.fromstring("RGB",(640,480),png)
im.save("/tmp/%s" % fname)
png = None
else:
if png is None:
png = linha
else:
png+= linha
imagemagick从错误的图像中识别:
/tmp/1349194042-24.png PNG 640x480 640x480 + 0 + 0 8位DirectClass 361KiB 0.010u 0:00.019
imagemagick从工作图像中识别:
/tmp/1349194586-01.png PNG 640x480 640x480 + 0 + 0 8位DirectClass 903KiB 0.010u 0:00.010
有没有人知道发生了什么?它是关于小/大端的东西吗?我尝试了Image.frombuffer
,Image.fromstring
,不同的模式,但没有。似乎PIL期望有关于缓冲区的更多信息。
谢谢,
答案 0 :(得分:4)
如果png
变量包含来自PNG文件的二进制数据,则无法使用frombuffer
读取它:用于读取原始像素数据。相反,请使用StringIO
和Image.open
,即:
img = Image.open(StringIO.StringIO(png))
答案 1 :(得分:0)
png
变量未初始化。您需要将其初始化为stdin。
我不确定您使用for linha in sys.stdin:
。这为您提供了行缓冲输入。您可能希望使用大小为N的块缓冲输入,如sys.stdin.read(N)。这将读取特定数量的字节,然后您可以解析数据,例如剪切文件名分隔符并填充Image.frombuffer()的输入缓冲区。