2010-08-20 86 views
2

我写了一个代码,它保存了一些png格式的位图(使用bitmap.Save()方法)。但由于某些未知原因,某些图像保存为损坏的PNG,所以Photoshop无法打开它们。 我需要在我的代码中检测这些png,而不是在photoshop中逐一打开它们。如何以编程方式检测png文件是否使用c#.NET损坏?

任何人都可以帮助我吗? 有什么方法可以读取创建的png并检查它是否损坏?

+2

由于是0字节,或者因为它们包含一种格式但使用另一种格式的文件扩展名,所以我有时会损坏图像。首先检查这两个标准,以确保。 (在你花费大量时间在可能避免的代码之前)。只是一个建议。 – JYelton 2010-08-20 15:43:04

+0

这些保存的PNG文件是否在除Photoshop之外的任何查看器中打开?如果文件真的被损坏,C#库中的图片加载器将不会打开这些文件。您可以尝试保存后立即打开文件。 – progo 2010-08-20 15:44:14

+1

我应该提到Irfanview(http://www.irfanview.com)(一个轻量级的图像查看器应用程序)会在打开一种格式的文件时通知您,但指定了不正确的扩展名并提供更改。 – JYelton 2010-08-20 15:48:24

回答

1

尝试并将文件读回C#并捕获相应的异常是有错误的(尽管您没有指定腐败形式 - 例如空白文件并不真正损坏,它只是空白!)

+0

我不认为零长度文件是一个有效的PNG。 – recursive 2010-08-20 17:47:05

+0

这也不是一个腐败的PNG。这只是不是一个PNG :) – Rushyo 2010-08-21 11:18:50

3

当您完成后,您是否确保正确关闭您的流?我认为Bitmap.Save()极不可能导致PNG损坏,或者Photoshop无法读取由.NET创建的任何PNG。

最简单的尝试就是立即在.NET中加载它。我会试图弄清楚为什么会发生这种情况 - 什么是特别腐败的?

+0

谢谢你。我不知道它受到了什么损害。但我试过 Image img = Image.FromFile(inputFile); 位图newImage = new Bitmap(inputFile); bool validImage = img.RawFormat.Equals(ImageFormat.Png); 他们没有任何错误!有没有其他的方法来加载图像? – user426490 2010-08-20 17:04:15

+0

加载后,你可以做些什么吗?检查它的高度和宽度 - 将一部分像素与原始像素进行比较。需要检查的一件事是,您可以使用WPF编解码器加载它们 - 它们对损坏的文件非常敏感 - 如果加载它,它可能不会损坏。如果Windows Vista显示它的缩略图,它可能没有损坏(损坏的PNG可能是一个病毒矢量,因此它们将不会在资源管理器中对其进行解码,除非它是完美的) – 2010-08-20 19:27:49

1

我会尝试读取文件,然后检查标题并查看是否存在所有必需的“块”(IHDR,PLTE,IDAT和IEND)并包含合理的数据。

+0

您能否给我发送一个链接到一个好的PNG规范文档。我无法知道每个“大块”应该在哪个地址出现,所以不知道如何检查它们?!!非常感谢您的帮助。 – user426490 2010-08-20 17:06:47

+0

有关规范,请参见http://www.libpng.org/pub/png/spec/1.2/PNG-Contents.html。你可能想看看第3节和第4.1节。每个块的开始没有预定义的地址,但可以使用“长度”字段遍历它们(请参阅第3节)。 – Tadmas 2010-08-20 18:39:57

0

Image.FromFile将抛出一个OutOfMemoryException如果它不能理解文件的格式。这让我觉得这是一个奇怪的选择,但是经验测试和文档都认为这是它所抛出的异常。

参见Image.FromFile Method (String) on the MSDN

+0

我已经试过这些,没有引发任何异常! Image img = Image.FromFile(inputFile); 位图newImage = new Bitmap(inputFile); bool validImage = img.RawFormat.Equals(ImageFormat.Png); – user426490 2010-08-20 17:05:22

0

PNG format允许不同的压缩,过滤和隔行扫描方法。你有没有意识到更新的方法的旧版本的Photoshop?

检查两个PNG文件的标题可能很有用:一个加载,一个不加载。