1

我在使用 PIL 从 STDIN 读取 png 图像时遇到问题。当图像由 PIL 写入时,它全部被打乱,但如果我使用简单的文件打开写入文件,写入和关闭文件将完美保存。

我有一个程序可以将 png 文件按顺序转储到标准输出,没有压缩,我使用 python 脚本读取该流,该脚本应该读取数据并在几乎每个 png 上执行一些例程。转储数据的程序写入某个字符串来分隔PNGs文件,该字符串是"{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 期望的缓冲区的信息。

谢谢,

4

2 回答 2

4

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

import io
from PIL import Image

img = Image.open(io.StringIO(png))
于 2012-10-02T16:35:25.520 回答
0

png变量在第一次调用 Image.frombuffer() 时未初始化。您需要将其初始化为标准输入中的某些内容。

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

于 2012-10-02T16:26:39.623 回答