gpt4 book ai didi

.net - 如何确定一个文件是否是.NET 中的图像文件?

转载 作者:行者123 更新时间:2023-12-02 09:16:38 24 4
gpt4 key购买 nike

我不想依赖文件扩展名。我不在乎知道它是什么类型的图像(.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() 将整个图像文件(如果是图像文件)加载到内存中。我认为这是浪费,因为我只需要文件类型,不需要在代码中进行任何进一步的图像操作。
  • 我不喜欢捕获 OutOfMemoryException,因为如果存在真正的内存不足问题并且我的程序吞掉它并继续运行怎么办?

有没有更好的方法来做到这一点?或者,上面列出的任何/所有我的担忧都是没有根据的吗?

编辑:自从在这里收到答案后,这些是我现在知道的三个解决方案:

  1. 通过 Image.FromFile() 和 try-catch 将整个图像加载到内存中。
    • 优点:对图像文件内容进行更深入的检查;涵盖多种图像类型。
    • 缺点:最慢; try-catch 和将完整图像文件加载到内存中的开销;捕获“真正的”OutOfMemoryException 的潜在危险。
  2. 检查图像文件的 header 字节。
    • 优点:速度快、内存占用低。
    • 缺点:可能很脆弱;需要针对每种文件类型进行编程。
  3. 检查文件扩展名。
    • 优点:最快;最简单。
    • 缺点:并非在所有情况下都有效;最容易出错。

(我没有看到明显的“赢家”,因为我可以想象每种情况都适合的情况。就我的应用程序而言,文件类型检查很少发生,因此方法 1 的性能问题并不重要问题。)

最佳答案

如果您只支持少数几种流行的图像格式,那么您可以简单地读取文件的前几个字节来根据 Magic Number 确定类型。

所提供链接中的示例:

  • GIF 图像文件的 ASCII 代码为“GIF89a”(47 49 46 38 39 61) 或“GIF87a”(47 49 46 38 37 61)
  • JPEG 图像文件以 FF D8 开头,以 FF D9 结尾。 JPEG/JFIF 文件包含“JFIF”的 ASCII 代码 (4A 46 49 46) 作为空终止字符串。
  • PNG 图像文件以 8 字节签名开头,该签名将文件标识为 PNG 文件并允许检测常见文件传输问题:\211 P N G\r\n\032\n (89 50 4E 47 0D 0A 1A 0A )。

关于.net - 如何确定一个文件是否是.NET 中的图像文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9354747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com