数值错误:无法找到以'i'模式读取指定文件的格式。

12
我正在尝试将一个png文件读入运行在docker中的Python-Flask应用程序,并且遇到了一个错误,该错误显示为:
ValueError:无法找到格式以使用'i'模式读取指定的文件
我已经使用HTML文件上传了一个文件,现在正在尝试读取它进行更多处理。 我看到scipy.misc.imread已被弃用,因此我正在尝试将其替换为imageio.imread。
if request.method=='POST':
    file = request.files['image']
    if not file: 
        return render_template('index.html', label="No file")
    #img = misc.imread(file)
    img = imageio.imread(file)

我收到了这个错误:

File "./appimclass.py", line 34, in make_prediction

img = imageio.imread(file)

File "/usr/local/lib/python3.6/site-packages/imageio/core/functions.py", line 221, in imread

reader = read(uri, format, "i", **kwargs)

File "/usr/local/lib/python3.6/site-packages/imageio/core/functions.py", line 139, in get_reader

"Could not find a format to read the specified file " "in mode %r" % mode

我也尝试过在导入 "import matplotlib.pyplot as plt" 之后使用 "img = plt.imread(file)",但是这仍然会出现错误:ValueError: Only know how to handle extensions: ['png'],尽管我上传的文件是 png 格式的。 - Calcutta
尝试在本地运行程序,即不使用docker环境。现在出现的错误是OSError:无法识别图像文件<FileStorage:'test-1.png'('image / png')>。 - Calcutta
意识到问题出在数据而非代码上。由于某种原因,PNG文件已经损坏,甚至无法用GIMP打开。因此使用了一组新的数据文件,一切正常运作。 - Calcutta
6个回答

9

虽然不是完全相关,但如果有帮助的话。我在另一个库(skimage)中遇到了相同的错误,解决方法是添加一个额外的“plugin”参数,就像这样 -

image = io.imread(filename,plugin='matplotlib')

7

我最近也遇到了完全相同的问题,问题是由于单个损坏的文件引起的。最好使用像 PIL 这样的工具来检查损坏的文件。

import os
from os import listdir
from PIL import Image

dir_path = "/path/"


for filename in listdir(dir_path):
    if filename.endswith('.jpg'):
        try:
            img = Image.open(dir_path+"\\"+filename) # open the image file
            img.verify() # verify that it is, in fact an image
        except (IOError, SyntaxError) as e:
            print('Bad file:', filename)
            #os.remove(dir_path+"\\"+filename) (Maybe)

1
我今天遇到了这个问题,发现如果在将文件读入imageio之前关闭它,问题就会消失。
错误信息是:
File "/home/vinny/pvenvs/chess/lib/python3.6/site-packages/imageio/core/functions.py", line 139, in get_reader                                                  "Could not find a format to read the specified file " "in mode %r" % mode  ValueError: Could not find a format to read the specified file in mode 'i' 

解决方案: 将file.close()放在images.append(imageio.imread(filename))之前,而不是之后。

1
添加选项 "pilmode":

imageio.imread(filename,pilmode="RGB")

它对我起作用了。


另外需要注意的是:如果使用pilmode="RGB",则图像形状从(28,28)变为(28,28,3),其中3代表三个通道。这里是更多讨论的链接:https://stackoverflow.com/questions/61552402/if-image-has-28-28-3-shape-how-do-i-convert-it-to-28-28-1 - Kasid Khan

1

enter image description here

我遇到了同样的错误,最终发现是因为图片损坏了。


0

我不小心将一些图片保存为PDF格式,导致出现了错误。删除这些不兼容的格式图片后问题得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接