Python PIL从STDIN读取PNG

时间:2012-10-02 16:17:46

标签: python png python-imaging-library

我在使用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.frombufferImage.fromstring,不同的模式,但没有。似乎PIL期望有关于缓冲区的更多信息。

谢谢,

2 个答案:

答案 0 :(得分:4)

如果png变量包含来自PNG文件的二进制数据,则无法使用frombuffer读取它:用于读取原始像素数据。相反,请使用StringIOImage.open,即:

img = Image.open(StringIO.StringIO(png))

答案 1 :(得分:0)

第一次调用Image.frombuffer()时,

png变量未初始化。您需要将其初始化为stdin。

我不确定您使用for linha in sys.stdin:。这为您提供了行缓冲输入。您可能希望使用大小为N的块缓冲输入,如sys.stdin.read(N)。这将读取特定数量的字节,然后您可以解析数据,例如剪切文件名分隔符并填充Image.frombuffer()的输入缓冲区。