C# 文件是图像吗?

C# 文件是图像吗?,c#,image,C#,Image,在C#中,判断特定文件是否为图像的最佳方法是什么 检查文件扩展名大多数图片格式在图像的前几个字节中指定文件类型。您可以读入几个字节并查找正确的标题 从技术上讲,文件扩展名不包含有关图像的任何重要数据。它只是帮助操作系统弄清楚用什么程序打开它。(但是,检查extn可能是最简单的方法,而且通常是正确的。) 大多数图像文件的开头都有一个或两个魔法字节。解码器和图像查看器使用它来识别文件类型。没有一条规则可以帮助您。这没有经过测试,但它是这样的: private string MimeType (str

在C#中,判断特定文件是否为图像的最佳方法是什么

检查文件扩展名

大多数图片格式在图像的前几个字节中指定文件类型。您可以读入几个字节并查找正确的标题

从技术上讲,文件扩展名不包含有关图像的任何重要数据。它只是帮助操作系统弄清楚用什么程序打开它。(但是,检查extn可能是最简单的方法,而且通常是正确的。)

大多数图像文件的开头都有一个或两个魔法字节。解码器和图像查看器使用它来识别文件类型。没有一条规则可以帮助您。

这没有经过测试,但它是这样的:

private string MimeType (string Filename)
{
    string mime = "[default]";
    string ext = GetExtension(Filename).ToLower();
    Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
    if (rk != null && rk.GetValue("Content Type") != null)
        mime = rk.GetValue("Content Type").ToString();
    return mime;
}

(对不起,我已经有一段时间没有做注册表工作了)

如果您需要验证文件是否为有效的图像格式,那么您必须使用某种代码,尝试根据所需文件的类型解析内容。为此,您需要调用Image类上的static FromFile方法来尝试获取一个Image实例

您可以检查前几个字节以查看特定图像格式的标记是否存在,但就像检查文件扩展名一样,它不能保证内容是有效的图像格式


如果您不需要验证,那么检查文件扩展名或mime类型就可以了。

我认为除了尝试加载和显示图像之外,没有任何方法可以保证给定的文件(或任何字节集)必然代表图像

但是,如果您有一些神秘的字节,您可以随时检查某些字节签名,以尝试推断它是否是格式良好的图像文件。您可以在wikipedia上查找文件头,但下面是我在单元测试中用于验证第三方报告工具输出的一些代码:

// Some signatures:

const string _pdfSignature = "%PDF-";
readonly byte[] _bmpSignature = new byte[2] { 0x42, 0x4D };
readonly byte[] _pngSignature = new byte[8] {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};
readonly byte[] _gifSignature = new byte[6] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 };
至于太平绅士:

Assert.That(_theBytes[0] == 0xFF && _theBytes[1] == 0xD8);    //Start of jpg file
Assert.That(_theBytes[_theBytes.Length - 2] == 0xFF && _theBytes[_theBytes.Length - 1] == 0xD9); //End of jpg file
我们这样做的方式(我现在找不到确切的代码,所以下面的代码未经测试)是尝试将图像作为位图加载。如果失败了,那就不是图像了

bool isImage;
try
{
  Bitmap.FromFile(filePath);
  isImage = true;
}
catch
{
  isImage = false;
}

诚然,我没有做太多,但这不是简单地查找mime类型吗


这是一种基于extn检查图像类型的好方法……但如果extn错误,该方法将失败。它还假设扩展名已正确注册到注册表中的mime类型,但并不总是保证如此。简单地尝试将文件作为位图加载会更容易。使用这种方法,一旦你有了mime类型,你仍然必须根据它做出决定……或者它仍然是一个图像,但你将无法对它做任何事情。有没有不加载整个文件的方法?使用Image.FromStream(stream,false,false)会更快,因为它不会尝试验证所有图像数据。您可以尝试此处列出的任何其他方法,但这取决于您尝试执行的操作。对于90%的应用程序+1,检查extn可能就足够了,但仅限于Image.FromStream版本。处理大型图像或跨慢速网络连接时,速度要快得多。应该补充一点,即使检查标头也不能100%保证。没有什么能阻止你用“正确”的头创建一个文件,但是在那之后会有随机垃圾。当然,最后这一切都取决于你想对“图像”文件做什么——OP没有告诉你——并且要做好准备,毕竟它可能不是一个“有效”的图像。