【问题标题】:Python PIL reading PNG from STDINPython PIL 从 STDIN 读取 PNG
【发布时间】:2020-10-06 23:25:53
【问题描述】:

我在使用 PIL 从 STDIN 读取 png 图像时遇到问题。当图像由 PIL 写入时,都是scrambled,但如果我使用简单文件打开写入文件,写入和关闭文件保存perfectly

我有一个程序可以将 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.frombufferImage.fromstring,不同的模式,但没有。似乎有更多关于 PIL 期望的缓冲区的信息。

谢谢,

【问题讨论】:

  • 您是否在stdin 上接收pixelspng 图像?您的解码器正在尝试将输入解码为 RGB 像素,并将忽略 PNG 标头(除其他外)。

标签: python png python-imaging-library


【解决方案1】:

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

import io
from PIL import Image

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 实际上 png 是在循环之外定义的,并填充在第一个“else”中。包含字符串“{fim:”的行出现在 png 文件的每一端。逻辑本身已得到纠正。问题在于 PIL 如何管理数据。
    猜你喜欢
    • 2016-02-10
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多