检测损坏的 png 文件的有效方法?

发布于 2024-08-24 02:58:35 字数 138 浏览 7 评论 0原文

我编写了一个程序来处理一堆由单独进程生成的 png 文件。捕获大部分工作正常,但有时进程会终止并重新启动,从而留下损坏的图像。我无法检测进程何时终止或哪个文件终止(大约有 3000 个 png 文件)。

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

I've written a program to process a bunch of png files that are generated by a seperate process. The capture mostly works, however there are times when the process dies and is restarting which leaves a corrupted image. I have no way to detect when the process dies or which file it dies one (there are ~3000 png files).

Is there a good way to check for a corrupted png file?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

哎呦我呸! 2024-08-31 02:58:35

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

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

from PIL import Image

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

(逐字取自我自己在这个帖子中的回答

Since you're on a Linux system you probably already have Python installed.

An easy way would be to try loading and verifying the files with PIL (Python Imaging Library) (you'd need to install that first).

from PIL import Image

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

(taken verbatim from my own answer in this thread)

水波映月 2024-08-31 02:58:35

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

I know this is a question from 2010, but I think this is a better solution: pngcheck.

情独悲 2024-08-31 02:58:35

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

(一种变体命名方案是像 Firefox 的下载程序一样 - 将 .partial 附加到真实文件名以获取临时名称。)

A different possible solution would be to slightly change how your processor processes the files: Have it always create a file named temp.png (for example), and then rename it to the "correct" name once it's done. That way, you know if there is a file named temp.png around, then the process got interrupted, whereas if there is no such file, then everything is good.

(A variant naming scheme would be to do what Firefox's downloader does -- append .partial to the real filename to get the temporary name.)

上课铃就是安魂曲 2024-08-31 02:58:35

有点黑客,但有效
如果你在 Linux 或类似的系统上运行,你可能有“转换”命令,

$ 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).

Kind of a hack, but works
If you are running on linux or something like you might have the "convert" command

$ 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

If you make an invalid png, and then try to convert, you'll get an error:

$ date> foo.png
$ convert foo.png foo.gif
convert: NotAPNGImageFile (foo.png).
一场信仰旅途 2024-08-31 02:58:35

查找所有非 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 recognize 是 ImageMagick 的一个工具。默认情况下,它仅检查文件头以获得更好的性能。这里我们使用 +ping 禁用该功能并让 identify 读取整个文件。

Find all non-PNG files:

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

Find all corrupted PNG files:

find . -type f -print0 | xargs -0 -P0 sh -c 'magick identify +ping "$@" > /dev/null' sh
  1. file command only checks magic number. Having the PNG magic number doesn't mean it is a well formed PNG file.
  2. magick identify is a tool from ImageMagick. By default, it only checks headers of the file for better performance. Here we use +ping to disable the feature and make identify read the whole file.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文