C# 在尝试打开文件之前,如何确定System.Drawing.Bitmap是否可以打开文件?

C# 在尝试打开文件之前,如何确定System.Drawing.Bitmap是否可以打开文件?,c#,bitmap,C#,Bitmap,我们有一些遗留代码,有一些。。。古怪的举止。您不能真正相信文件扩展名知道它是什么类型的文件。最大的例子是JPG实际上是TIF 可能还有其他复杂之处,所以除了文件的数据本身,我不能指望任何东西告诉我是否可以处理图像。我现在已经用try/catch包装了它,但是我不喜欢使用异常来进行流控制 try { using (Bitmap current = (Bitmap)Bitmap.FromFile(file)) { // Use current } } catc

我们有一些遗留代码,有一些。。。古怪的举止。您不能真正相信文件扩展名知道它是什么类型的文件。最大的例子是JPG实际上是TIF

可能还有其他复杂之处,所以除了文件的数据本身,我不能指望任何东西告诉我是否可以处理图像。我现在已经用try/catch包装了它,但是我不喜欢使用异常来进行流控制

try
{
    using (Bitmap current = (Bitmap)Bitmap.FromFile(file))
    {
        // Use current
    }
}
catch
{
    // Must not be an image file
}

我们无法更改遗留代码以使其有意义。有没有比这更好的方法知道
文件
是图像?

这听起来可能很愚蠢,但位图打开的文件是bmp或衍生文件(png、jpeg等)


能否尝试检查文件扩展名是否有这些扩展名?

首先,您可能希望使用
Image.FromFile
而不是
Bitmap.FromFile

真的没有简单的方法来满足你的要求
FromFile
将委托给GDI+,在您真正尝试打开该文件之前,无法知道GDI+是否会喜欢该文件

你可以试试看。但最终,头仍然很可能是有效的,但文件本身会损坏。此外,您还为处理图像标题的代码添加了新的复杂性和可能的bug向量


我认为这实际上是一个例外情况,而不是将异常用于流控制的示例。如果您认为是图像的文件结果不是图像,那就是一个例外。

为什么要使用
image.FromFile
?区别是什么?
FromFile
是在
Image
上定义的,并且没有被
Bitmap
覆盖-存在
Bitmap.FromFile
的唯一原因是因为
Bitmap
Image
的子类。我怀疑这就是为什么MSDN中的示例通常也会显示
Image.FromFile
。没有区别。你的解释实际上是在推理不在乎。嗯……我认为对问题的描述表明这是不可能的。