如何检查文件是否为有效的图像文件?

2020/11/30 19:42 · python ·  · 0评论

我目前正在使用PIL。

from PIL import Image
try:
    im=Image.open(filename)
    # do stuff
except IOError:
    # filename not an image file

但是,尽管这足以涵盖大多数情况,但未检测到某些图像文件,例如xcf,svg和psd。Psd文件会引发OverflowError异常。

有办法我也可以包括它们吗?

很多时候,前几个字符对于各种文件格式来说都是一个神奇的数字。除了上面的异常检查之外,您还可以检查此内容。

我刚刚找到了内置的imghdr模块。从python文档中:

imghdr模块确定文件或字节流中包含的图像的类型。

它是这样工作的:

>>> import imghdr
>>> imghdr.what('/tmp/bass')
'gif'

使用模块比重新实现类似功能要好得多

除了Brian建议的内容之外,您还可以使用PIL的verify方法检查文件是否损坏。

im.verify()

尝试确定文件是否损坏,而无需实际解码图像数据。如果此方法发现任何问题,它将引发适当的异常。此方法仅适用于新打开的图像。如果图像已经加载,则结果不确定。另外,如果在使用此方法后需要加载图像,则必须重新打开图像文件。属性

除了PIL图像检查,您还可以添加文件扩展名检查,如下所示:

filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'))

请注意,这仅检查文件名是否具有有效的图像扩展名,它实际上不会打开图像以查看它是否为有效图像,这就是为什么您需要额外使用PIL或其他答案中建议的一个库的原因

更新资料

我还在GitHub上的Python脚本中实现了以下解决方案

我还验证了损坏的文件(jpg)经常不是“损坏”的图像,即,损坏的图片文件有时仍是合法的图片文件,原始图像丢失或更改了,但是您仍然可以正确加载它。但是,文件截断总是导致错误。

结束更新

您可以使用具有大多数图像格式的Python Pillow(PIL)模块来检查文件是否为有效且完整的图像文件。

在您还希望检测破损图像的情况下,@ Nadia Alramli会正确建议该im.verify()方法,但这不会检测到所有可能的图像缺陷,例如,im.verify不会检测到截断的图像(大多数观看者经常在灰色区域加载)。

Pillow也能够检测到此类缺陷,但是您必须在其中应用图像处理或图像解码/重新编码或触发检查。最后,我建议使用以下代码:

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(PIL.Image.FLIP_LEFT_RIGHT)
  im.close()
except: 
  #manage excetions here

如果出现图像缺陷,此代码将引发异常。请考虑im.verify大约比执行图像处理快100倍(我认为翻页是更便宜的转换之一)。使用此代码,您将使用标准Pillow或大约40 MBytes / sec(使用Pillow-SIMD模块)(现代2.5Ghz x86_64 CPU)验证一组图像,速度约为10 MB /秒。

对于其他格式psdxcf ..,您可以使用Imagemagick包装器Wand,代码如下:

im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()

但是,根据我的实验,Wand不能检测到截断的图像,我认为它会将缺少的部分加载为灰色区域而没有提示。

我红认为,ImageMagick的具有外部命令识别可以做的工作,但我还没有找到一种方法来编程方式调用该函数,我没有测试过这条路线。

我建议始终执行初步检查,检查文件大小不为零(或很小),这是一个非常便宜的主意:

statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
  #manage here the 'faulty image' case

在Linux上,您可以使用python-magic(http://pypi.python.org/pypi/python-magic/0.1),它使用libmagic来识别文件格式。

AFAIK,libmagic会查看文件并尝试向您提供有关格式的更多信息,例如位图尺寸,格式版本等。因此,您可能会将其视为对“有效性”的肤浅测试。

对于“有效”的其他定义,您可能必须编写自己的测试。

您可以使用Python绑定到libmagic,python-magic,然后检查mime类型。这不会告诉您文件是否已损坏或完好无损,但是它应该能够确定文件的类型。

一种选择是使用filetype软件包。

安装

python -m pip install filetype

好处

  1. 快速:通过加载图片的前几个字节来工作(检查幻数
  2. 支持不同的mime类型:图像,视频,字体,音频,档案。

文件类型> = 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

format = [".jpg",".png",".jpeg"]
 for (path,dirs,files) in os.walk(path):
     for file in files:
         if file.endswith(tuple(format)):
             print(path)
             print ("Valid",file)
         else:
             print(path)
             print("InValid",file)
本文地址:http://python.askforanswer.com/ruhejianchawenjianshifouweiyouxiaodetuxiangwenjian.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!