python 查找损坏图片_使用Python查找损坏的图像

论坛 期权论坛 脚本     
已经匿名di用户   2022-7-2 21:49   2765   0

python 查找损坏图片

赶上本系列:

第1部分:使用Python自动执行数字艺术家的重复任务

第2部分:针对数字艺术家的Python文件管理技巧


如果您正在计算机上处理图像,那么最终一定会遇到损坏的文件,从而毁了您的一天。 我在动画渲染中遇到了这个问题(请记住,这里的最佳实践是渲染到一系列图像文件而不是单个视频文件)。 但是,动画和视觉效果并不是您看到图像损坏的唯一地方。 您也可以在其他领域轻松地做到这一点。 也许您是摄影师,并且拍摄了许多括号HDRI(高动态范围成像)色调映射,并且在从相机传输文件时出现了一些故障。

问题不在于修复或替换损坏的映像而花费的精力,通常只是重新渲染映像或将好的映像复制到您的计算机上,而窍门是找到那些坏的映像。图像在过程中越早越好。 你不知道的越长,当遇到一个腐败的形象,你会面临麻烦。

所以你会怎么做? 好了,您可以一次在一个图像编辑器或所选的查看器中一次打开一个文件,然后让该程序告诉您有问题。 但是,照片图像很大,仅查找一个或两个坏人就需要进行整套检查,这既烦人又耗时。 虽然动画渲染通常是较小的文件,你往往更多人去通过。 就我而言,我定期制作渲染中包含超过44,000帧的渲染。 (不,这不是错别字-4.4万帧。)

解决方案? 你猜到了。 编写脚本。

与本系列的前几篇文章一样,您将使用Python进行脚本编写。 第一步:获取文件清单。 幸运的是,如果您阅读了本系列上一篇文章 ,那么您知道这是使用os模块的问题。 假设您要检查的所有图像文件都在硬盘驱动器上的单个目录中。 此外,假设您将从该目录中运行此脚本。 使用Python,您可以使用以下代码获取这些文件的列表:



   
import os

for filename in os . listdir ( './' ) :
print ( filename )

如果愿意,可以通过只查找以。结尾的文件来缩小图像列表的范围(或至少更明确地指定它;例如,您不希望将此脚本包括在其中一个文件中)。 PNG扩展名:



   
import os

for filename in os . listdir ( './' ) :
if filename. endswith ( '.png' ) :
print ( filename )

现在,您在当前工作目录中有了一个PNG图像文件列表。 怎么办? 好了,现在您需要找出那些映像中的哪一个损坏了。 在本系列的前几篇文章中,我们默认使用Python附带的模块。 不幸的是,很难在没有任何图像处理功能的情况下发现图像是否损坏,Python 2和Python 3都没有提供任何开箱即用的方式来处理它。 您需要为自己准备一个图像处理模块才能查看这些文件。 令人高兴的是,Python开发社区使您更轻松了。

实际上,您有一个完整的软件包库可供您安装。 您只需要知道如何获得它们。 让我向您介绍pip ,这是用于安装Python软件包的推荐工具。 当您安装Python时,默认情况下会在大多数平台上安装该工具。

注意:我使用的是Python 3,但是如果您使用的是Python 2,则我在本系列文章中编写的几乎所有内容都可以在两种语言之间转换。 同样,许多Linux发行版都希望您使用自己的软件包管理系统,而不是使用pip来安装Python软件包。 如果愿意,可以坚持这样做。 建议在此处使用pip主要是为了在可以使用Python的所有平台上保持一致。

我建议您安装的特定软件包称为Pillow 。 它是原始PIL(Python影像库)的“友好分支”,可在当前的Python 3和Python 2版本中使用。安装Pillow所需的只是启动终端窗口并键入pip install Pillow 。 Python打包工具应该在那里为您处理其余的工作。

一旦安装了Pillow,您实际上需要有一种在脚本中使用它的方法。 由于已安装,因此您可以将其视为Python随附的任何模块。 您使用import -在这种情况下,您可以使用import PIL 。 但是,要查找损坏的图像,您实际上并不需要将整个Pillow库导入到我们的脚本中。 在Python中,您可以仅导入模块的单个子组件。 这是一个好习惯,因为它可以减少脚本的内存占用空间,并且同样重要的是,它可以使脚本从一开始就做清楚。 另外,导入子组件时,一旦进入脚本的末端,最终就需要减少键入次数。 这总是很不错的奖励。

要导入模块的子组件,请在import之前使用from指令。 对于Pillow,您的脚本实际上只需要使用Image类。 因此,您的导入行from PIL import Image看起来像。 实际上,您可以使用os模块执行相同的操作。 如果回头看前面的代码,可能会注意到您仅在os模块中使用listdir函数。 因此,您可以使用from os import listdir代替import os 。 这意味着当您进入脚本时,不再需要键入os.listdir 。 相反,您只需要键入listdir ,因为这就是您导入的所有内容。

综合所有内容,您的脚本现在应如下所示:



   
from os import listdir
from PIL import Image

for filename in listdir ( './' ) :
if filename. endswith ( '.png' ) :
print ( filename )

您已经在Pillow中加载了Image类,但是您的脚本仍未对其进行任何处理。 现在是时候进入脚本的功能部分了。 您要做的是脚本化的等效操作,即打开每个图像文件并检查其是否可读。 如果有错误,则说明文件错误。 为此,您将使用try / except块。 简而言之,您的脚本将尝试运行打开文件的功能。 如果该函数返回错误(否则称为异常) ,则说明图像有问题。 特别是,如果异常类型为IOErrorSyntaxError ,则您知道自己的图像不好。

进行try / except的语法非常简单。 我已经在下面的代码注释中对其进行了描述:



   
try : # These next functions may produce an exception
# <some function>
except ( IOError , SyntaxError ) as e: # These are the exceptions we're looking for
# <do something... like print an intelligent error message>

在寻找损坏的图像文件的情况下,您将要测试两个功能: Image.open()verify() 。 如果将它们包装在try / except块中,则损坏的图像查找脚本应如下所示:



   
from os import listdir
from PIL import Image

for filename in listdir ( './' ) :
if filename. endswith ( '.png' ) :
try :
img = Image. open ( './' +filename ) # open the image file
img. verify ( ) # verify that it is, in fact an image
except ( IOError , SyntaxError ) as e:
print ( 'Bad file:' , filename ) # print out the names of corrupt files

然后你去。 将此脚本保存在图像目录中。 当您从命令行运行它时,您应该在那里获得所有损坏的图像文件的列表。 如果没有任何输出,则可以假定所有这些图像文件都是有效的有效图像。

当然,能够在任意目录上使用此脚本会很好。 并且让脚本提示您指示它继续进行操作并为您删除那些损坏的文件会更好。 好消息! 您可以使脚本完全做到这一点。 我们将在本系列的下一篇文章中对此进行介绍。

同时,尽享根除图像文件夹中损坏的乐趣。

翻译自: https://opensource.com/article/17/2/python-tricks-artists

python 查找损坏图片

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP