我目前正在使用PIL。
from PIL import Image
try:
im=Image.open(filename)
# do stuff
except IOError:
# filename not an image file
然而,尽管这足以覆盖大多数情况,但一些图像文件例如xcf、svg和psd未被检测到。Psd文件会抛出OverflowError异常。
我能不能想办法也包括它们呢?
我目前正在使用PIL。
from PIL import Image
try:
im=Image.open(filename)
# do stuff
except IOError:
# filename not an image file
然而,尽管这足以覆盖大多数情况,但一些图像文件例如xcf、svg和psd未被检测到。Psd文件会抛出OverflowError异常。
我能不能想办法也包括它们呢?
>>> import imghdr
>>> imghdr.what('/tmp/bass')
'gif'
imghdr.what(path)
方法如果给定的 path
不是已识别的图片文件类型,则返回 None
。列表 中列出了目前已被识别的图片文件类型,包括:rgb、gif、pbm、pgm、ppm、tiff、rast、xbm、jpeg、bmp、png、webp 和 exr。 - patryk.bezaimghdr.what(path)
会返回 None
,即使文件是有效的图像,特别是对于 JPEG 格式的图像。 - GuillaumeDufay除了Brian提出的建议外,您还可以使用PIL的verify方法来检查文件是否损坏。
im.verify()
尝试确定文件是否损坏,而不实际解码图像数据。如果此方法发现任何问题,则引发适当的异常。此方法仅在新打开的图像上有效;如果已经加载了图像,则结果是未定义的。此外,如果您需要在使用此方法后加载图像,则必须重新打开图像文件。属性
除了PIL
图像检查之外,您还可以添加文件名扩展名检查,如下所示:
filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'))
请注意,这仅检查文件名是否具有有效的图像扩展名,它不会实际打开图像以查看其是否有效。这就是为什么您需要另外使用PIL
或其他答案中建议的库。
from PIL import Image img = Image.open(filename) print(img.format)
然后像这样检查它:img.format.lower() in ['png', 'jpg', 'jpeg', 'tiff', 'bmp', 'gif']
。 - tsveti_iko一种选项是使用filetype
包。
安装
python -m pip install filetype
优势
示例
filetype >= 1.0.7
import filetype
filename = "/path/to/file.jpg"
if filetype.is_image(filename):
print(f"{filename} is a valid image...")
elif filetype.is_video(filename):
print(f"{filename} is a valid video...")
文件类型 <= 1.0.6
import filetype
filename = "/path/to/file.jpg"
if filetype.image(filename):
print(f"{filename} is a valid image...")
elif filetype.video(filename):
print(f"{filename} is a valid video...")
官方存储库的其他信息:https://github.com/h2non/filetype.py
更新
我还在我的Python脚本这里的GitHub链接中实现了以下解决方案。
我还验证了损坏的文件(jpg)通常不是“损坏”的图像文件,即损坏的图片文件有时仍然是合法的图片文件,原始图像丢失或被修改,但您仍然能够加载它而没有错误。但是,文件截断总是会导致错误。
结束更新
您可以使用Python Pillow(PIL)模块来检查文件是否为有效和完整的图像文件,支持大多数图像格式。
如果您希望检测损坏的图像,@Nadia Alramli正确地建议使用im.verify()
方法,但是这不能检测所有可能的图像缺陷,例如,im.verify
无法检测到被截断的图像(大多数查看器通常会加载灰色区域)。
Pillow也能够检测这些类型的缺陷,但您必须应用图像操作或图像解码/重新编码才能触发检查。最后,我建议使用此代码:
from PIL import Image
try:
im = Image.load(filename)
im.verify() #I perform also verify, don't know if he sees other types o defects
im.close() #reload is necessary in my case
im = Image.load(filename)
im.transpose(Image.FLIP_LEFT_RIGHT)
im.close()
except:
#manage excetions here
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
然而,根据我的实验,Wand无法检测到被截断的图像。我认为它会将缺少的部分加载为灰色区域而不提示。
我了解到Imagemagick有一个外部命令identify可以完成这项工作,但我还没有找到以编程方式调用该函数的方法,也没有测试过这种方法。
我建议始终进行初步检查,检查filesize是否为零(或非常小),这是一个非常便宜的想法:
import os
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case
从Fabiano和Tiago的答案进行调整。
from PIL import Image
def check_img(filename):
try:
im = Image.open(filename)
im.verify()
im.close()
im = Image.open(filename)
im.transpose(Image.FLIP_LEFT_RIGHT)
im.close()
return True
except:
print(filename,'corrupted')
return False
if not check_img('/dir/image'):
print('do something')
可以使用图像的扩展名来检查图像文件,如下所示。
import os
for f in os.listdir(folderPath):
if (".jpg" in f) or (".bmp" in f):
filePath = os.path.join(folderPath, f)