【问题标题】:PIL cannot identify image file for io.BytesIO objectPIL 无法识别 io.BytesIO 对象的图像文件
【发布时间】:2015-06-26 15:49:17
【问题描述】:

我正在使用 PIL 的 Pillow fork 并不断收到错误

OSError: 无法识别图像文件 <_io.bytesio object at>

尝试打开图像时。我正在使用带有 python 3.4 的 virtualenv 并且没有安装 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.

【问题讨论】:

  • 我建议将解决方案从帖子移至自己的答案。只是为了格式化
  • @FracturedRetina 我同意。请将答案移至单独的帖子,以便社区对其进行投票并获得声誉,Elan M。
  • 意外加载 PDF 而不是 PNG 时发生在我身上。

标签: python pillow bytesio


【解决方案1】:

(这个解决方案来自作者本人,我刚刚移到这里。)

解决方案:

# 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()返回字节对象的方式。它似乎是无效数据,并且“编码”只能是原始数据,它仍然似乎输出错误数据,因为几乎每个字节都以\xff\ 格式出现。但是,通过 BytesIO 保存字节并使用 .read() 函数读取整个图像会提供正确的字节,以便以后需要时实际使用。

【讨论】:

    【解决方案2】:

    image = Image.open(io.BytesIO(decoded)) # 文件“C:\Users\14088\anaconda3\envs\tensorflow\lib\site-packages\PIL\Image.py”,第 2968 行,打开 # "cannot identify image file %r" % (filename if filename else fp) # PIL.UnidentifiedImageError: cannot identify image file <_io.bytesio object at>

    === 我修复了工作: message = request.get_json(force=True)

    encoded = message['image']
    # https://stackoverflow.com/questions/26070547/decoding-base64-from-post-to-use-in-pil
    #image_data = re.sub('^data:image/.+;base64,', '', message['image'])
    image_data = re.sub('^data:image/.+;base64,', '', encoded)
    # Remove extra "data:image/...'base64" is Very important
    # If "data:image/...'base64" is not remove, the following line generate an error message: 
    # File "C:\Work\SVU\950_SVU_DL_TF\sec07_TF_Flask06_09\32_KerasFlask06_VisualD3\32_predict_app.py", line 69, in predict
    # image = Image.open(io.BytesIO(decoded))
    # File "C:\Users\14088\anaconda3\envs\tensorflow\lib\site-packages\PIL\Image.py", line 2968, in open
    # "cannot identify image file %r" % (filename if filename else fp)
    # PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x000002B733BB11C8>
    # image = Image.open(BytesIO(base64.b64decode(image_data)))
    decoded = base64.b64decode(image_data)
    image = Image.open(io.BytesIO(decoded))
    # return json.dumps({'result': 'success'}), 200, {'ContentType': 'application/json'}
    #print('@app.route => image:')
    #print()
    processed_image = preprocess_image(image, target_size=(224, 224))
    
    prediction = model.predict(processed_image).tolist()
    #print('prediction:', prediction)
    response = {
        'prediction': {
            'dog': prediction[0][0],
            'cat': prediction[0][1]
        }
    }
    print('response:', response)
    return jsonify(response)
    

    【讨论】:

      【解决方案3】:

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

      GDCM 通常是较难安装的一种。轻松安装它的最新方法是

      conda install -U conda-forge gdcm
      

      【讨论】:

        【解决方案4】:

        在某些情况下,当您处理 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) 使用代码功劳

        【讨论】:

          【解决方案5】:

          图像文件本身可能已损坏,因此如果您要处理大量图像文件,只需将处理每个图像文件的行加上 try catch 语句即可。

          【讨论】:

            猜你喜欢
            • 2018-07-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-08
            • 1970-01-01
            • 2021-08-02
            • 1970-01-01
            相关资源
            最近更新 更多