【发布时间】:2012-03-10 10:00:18
【问题描述】:
我不想依赖文件扩展名。我不关心它是什么类型的图像(.jpg、.png 等),我只是想知道文件是否是图像。如果可能,我宁愿不使用任何非 .NET dll。
我知道如何做到这一点的最佳方法如下:
bool isImageFile;
try
{
Image.FromFile(imageFile).Dispose();
isImageFile = true;
}
catch (OutOfMemoryException)
{
isImageFile = false;
}
如此处所述:http://msdn.microsoft.com/en-us/library/stf701f5.aspx、Image.FromFile() 如果文件不是有效的图像格式,则抛出 OutOfMemoryException。使用上面的方法给了我正是我想要的结果,但我不想使用它,原因如下:
- 我认为,出于性能原因,将 try-catch 用于正常程序执行是一种不好的做法。
-
Image.FromFile()将整个图像文件(如果是图像文件)加载到内存中。我认为这很浪费,因为我只需要文件类型,此时不需要在我的代码中进行任何进一步的图像处理。 - 我不喜欢捕捉
OutOfMemoryExceptions,因为如果出现真正的内存不足问题并且我的程序吞下了它并继续运行怎么办?
有没有更好的方法来做到这一点?或者,我上面列出的任何/所有问题都是没有根据的吗?
编辑:自从在这里收到答案后,以下是我现在知道的三种解决方案:
- 通过
Image.FromFile()和try-catch 将整个图像加载到内存中。- 优点:对图像文件内容进行更深入的检查;涵盖许多图像类型。
- 缺点:最慢; try-catch 和将完整图像文件加载到内存中的开销;捕获“真正的”OutOfMemoryException 的潜在危险。
- 检查图像文件的标头字节。
- 优点:快速、低内存使用。
- 缺点:可能很脆弱;需要针对每种文件类型进行编程。
- 检查文件扩展名。
- 优点:最快;最简单。
- 缺点:并非在所有情况下都有效;最容易出错。
(我没有看到明确的“赢家”,因为我可以想象每个人都适合的情况。出于我的应用程序的目的,文件类型检查很少发生,以至于方法 1 的性能问题不是问题。)
【问题讨论】:
标签: .net image file-format file-type