6

我编写了一个程序来处理由单独进程生成的一堆 png 文件。捕获主要是有效的,但是有时进程会终止并重新启动,这会留下损坏的图像。我无法检测进程何时死亡或哪个文件死亡(大约有 3000 个 png 文件)。

有没有检查损坏的 png 文件的好方法?

4

5 回答 5

8

我知道这是 2010 年的一个问题,但我认为这是一个更好的解决方案:pngcheck

于 2015-04-05T20:57:00.053 回答
7

由于您使用的是 Linux 系统,因此您可能已经安装了 Python。

一种简单的方法是尝试使用 PIL(Python 图像库)加载和验证文件(您需要先安装它)。

from PIL import Image

v_image = Image.open(file)
v_image.verify()

(从我自己在这个线程中的回答中逐字提取)

于 2010-03-05T09:17:56.773 回答
4

另一种可能的解决方案是稍微改变处理器处理文件的方式:让它始终创建一个名为 temp.png 的文件(例如),然后在完成后将其重命名为“正确”的名称。这样,你就知道周围是否有一个名为 temp.png 的文件,那么进程就会被中断,而如果没有这样的文件,那么一切都很好。

(一种变体命名方案是做 Firefox 的下载器所做的——将 .partial 附加到真实文件名以获取临时名称。)

于 2010-03-05T01:46:04.653 回答
2

一种 hack,但可以工作如果你在 linux 或类似的东西上运行,你可能有“convert”命令

$ convert --help
Version: ImageMagick 5.5.6 04/01/03 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 2003 ImageMagick Studio LLC

Usage: convert [options ...] file [ [options ...] file ...] [options ...] file

如果你制作了一个无效的 png,然后尝试转换,你会得到一个错误:

$ date> foo.png
$ convert foo.png foo.gif
convert: NotAPNGImageFile (foo.png).
于 2010-03-05T01:39:26.110 回答
0

查找所有非 PNG 文件:

find . -type f -print0 | xargs -0 file --mime | grep -vF image/png

查找所有损坏的 PNG 文件:

find . -type f -print0 | xargs -0 -P0 sh -c 'magick identify +ping "$@" > /dev/null' sh
  1. file命令只检查幻数。拥有 PNG 幻数并不意味着它是格式良好的 PNG 文件。
  2. magick identify是 ImageMagick 的一个工具。默认情况下,它只检查文件的标题以获得更好的性能。在这里,我们使用+ping禁用该功能并identify读取整个文件。
于 2022-03-03T06:27:07.507 回答