PIL open()方法不能与BytesIO一起使用

Nat*_*cat 16 python python-imaging-library pillow

出于某种原因,当我尝试从BytesIO蒸汽制作图像时,它无法识别图像.这是我的代码:

from PIL import Image, ImageGrab
from io import BytesIO

i = ImageGrab.grab()
i.resize((1280, 720))
output = BytesIO()
i.save(output, format = "JPEG")
output.flush()
print(isinstance(Image.open(output), Image.Image))
Run Code Online (Sandbox Code Playgroud)

它抛出的错误的堆栈跟踪:

Traceback (most recent call last):
  File "C:/Users/Natecat/PycharmProjects/Python/test.py", line 9, in <module>
    print(isinstance(Image.open(output), Image.Image))
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 2126, in open
    % (filename if filename else fp))
IOError: cannot identify image file <_io.BytesIO object at 0x02394DB0>
Run Code Online (Sandbox Code Playgroud)

我正在使用PIL的Pillow实现.

Lie*_*yan 28

将BytesIO视为文件对象,在完成图像写入后,文件的光标位于文件的末尾,因此在Image.open()尝试调用时output.read(),它会立即获得EOF.

您需要添加一个output.seek(0)经过之前outputImage.open().

  • 不,它不是“固定在 BytesIO 中”。BytesIO 正在按设计工作。新版本的 `PIL.open()` 只是无条件调用 `.seek(0)` ([src](https://github.com/python-pillow/Pillow/commit/735d34260814f9180b773723fd741a7da73047ed))以支持从 HTTP 请求读取,看起来它无意中解决了这个问题。PIL 在这里通过强制 `.seek(0)` 所做的事情破坏了那些想要从容器/串联档案中读取而不解压缩或制作额外副本的用户的用例。我猜他们可能认为与 HTTP 请求对象相比,这个用例相当小众。 (7认同)
  • 对于任何偶然发现这个答案的人来说,看起来这个问题可能已经在最新版本的 BytesIO 中得到了解决。我正在运行 Image.open(io.BytesIO(image_contents)) 而不调用eek(0),没有任何问题。我遇到了类似的错误,但这是因为 image_contents 不是有效的图像数据。 (2认同)