PIL无法识别io.BytesIO obj的图像文件

2024-10-06 11:21:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用PIL的枕叉不断地收到错误

OSError: cannot identify image file <_io.BytesIO object at 0x103a47468>

当试图打开图像时。我将virtualenv与python 3.4一起使用,不安装PIL。

我试图在别人遇到同样问题的基础上找到解决办法,但是这些办法对我不起作用。这是我的代码:

from PIL import Image
import io

# This portion is part of my test code
byteImg = Image.open("some/location/to/a/file/in/my/directories.png").tobytes()

# Non test code
dataBytesIO = io.BytesIO(byteImg)
Image.open(dataBytesIO) # <- Error here

图像存在于文件的初始打开处,并将其转换为字节。这似乎对几乎所有人都有效,但我不明白为什么它对我失败了。

编辑:

dataBytesIO.seek(0)

不起解决方案的作用(尝试过),因为我不是通过流保存图像,我只是用数据实例化BytesIO,因此(如果我认为正确的话)seek应该已经是0。


Tags: iotest图像imageimportpilmycode
3条回答

(这一解决办法来自作者本人。我刚把它搬到这里。)

解决方案:

# This portion is part of my test code
byteImgIO = io.BytesIO()
byteImg = Image.open("some/location/to/a/file/in/my/directories.png")
byteImg.save(byteImgIO, "PNG")
byteImgIO.seek(0)
byteImg = byteImgIO.read()


# Non test code
dataBytesIO = io.BytesIO(byteImg)
Image.open(dataBytesIO)

问题在于Image.tobytes()返回byte对象的方式。它似乎是无效数据,“编码”不能是原始数据以外的任何内容,因为几乎每个字节都是以\xff\格式出现的,而原始数据似乎仍然输出错误数据。但是,通过BytesIO保存字节,并使用.read()函数读取整个图像,得到了正确的字节,以后需要时可以实际使用。

读取Dicom文件时,问题可能是由于Dicom压缩造成的。 确保gdcm和pydicom都已安装。

GDCM通常是更难安装的。最新的安装方法是

conda install -U conda-forge gdcm

在某些情况下,处理原始图像文件(如CR2)时也会发生相同的错误。示例:http://www.rawsamples.ch/raws/canon/g10/RAW_CANON_G10.CR2

当你试图跑步时:

byteImg = Image.open("RAW_CANON_G10.CR2")

您将得到以下错误:

OSError: cannot identify image file 'RAW_CANON_G10.CR2'

因此,首先需要使用rawkit转换图像,下面是一个如何进行转换的示例:

from io import BytesIO
from PIL import Image, ImageFile
import numpy
from rawkit import raw
def convert_cr2_to_jpg(raw_image):
    raw_image_process = raw.Raw(raw_image)
    buffered_image = numpy.array(raw_image_process.to_buffer())
    if raw_image_process.metadata.orientation == 0:
        jpg_image_height = raw_image_process.metadata.height
        jpg_image_width = raw_image_process.metadata.width
    else:
        jpg_image_height = raw_image_process.metadata.width
        jpg_image_width = raw_image_process.metadata.height
    jpg_image = Image.frombytes('RGB', (jpg_image_width, jpg_image_height), buffered_image)
    return jpg_image

byteImg = convert_cr2_to_jpg("RAW_CANON_G10.CR2")

GitHub上mateusz michalik的代码信用(https://github.com/mateusz-michalik/cr2-to-jpg/blob/master/cr2-to-jpg.py

相关问题 更多 >