我有一个图像大小调整的程序,它的工作原理。问题是当用户在文件选择对话框中选择非图像文件时,它会崩溃。如何查看图像文件?
答案 0 :(得分:7)
由于OP坚持使用VB版本,因此VB.NET等效于0xA3's answer。
Function IsValidImage(filename As String) As Boolean
Try
Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)
Catch generatedExceptionName As OutOfMemoryException
' Image.FromFile throws an OutOfMemoryException
' if the file does not have a valid image format or
' GDI+ does not support the pixel format of the file.
'
Return False
End Try
Return True
End Function
您可以按如下方式使用它:
If IsValidImage("c:\path\to\your\file.ext") Then
'do something
'
Else
'do something else
'
End If
修改强>
我不建议您检查文件扩展名。任何人都可以使用.jpg
扩展名保存不同的文件(例如文本文档)并诱骗您使用该应用程序以获取它是一张图片。
最好的方法是使用上面的函数加载图像或打开前几个字节并检查JPEG签名。
您可以在此处找到有关JPEG文件及其标题的更多信息:
答案 1 :(得分:5)
非常原始的检查是简单地尝试加载图像。如果它无效,则会抛出OutOfMemoryException
:
static bool IsImageValid(string filename)
{
try
{
System.Drawing.Image img = System.Drawing.Image.FromFile(filename);
}
catch (OutOfMemoryException)
{
// Image.FromFile throws an OutOfMemoryException
// if the file does not have a valid image format or
// GDI+ does not support the pixel format of the file.
//
return false;
}
return true;
}
如果我正确地理解了您的问题,那么无论如何它都会加载图像。因此,简单地将加载操作包装在try / catch块中并不意味着任何额外的开销。对于这种方法的VB.NET解决方案,请查看@Alex Essilfie的答案。
有些人想知道为什么Image.FromFile
在无效文件上投放OOM应该在Hans Passant的答案中读到以下问题:
<强> Is there a reason Image.FromFile throws an OutOfMemoryException for an invalid image format? 强>
答案 2 :(得分:3)
当然,你的第一道防线只是检查文件的扩展名:
Function IsImageFile(ByVal filename As String) As Boolean
Dim ext As String = Path.GetExtension(filename).ToLowerInvariant()
' This supposes your program can deal only with JPG files; '
' you could add other extensions here as necessary. '
Return ext = ".jpg" OrElse ext = ".jpeg"
End Function
更好的是,正如SLC在评论中建议的那样,设置对话框的Filter
属性:
dialog.Filter = "Image files|*.jpg;*.jpeg"
这不是一个保证 - 理想情况下你想检查文件本身以验证它是一个图像,理论上你也应该能够加载具有异常扩展的文件,如果它们实际上是图像文件(也许只是首先要求用户确认) - 但这是一个简单的开始。
答案 3 :(得分:2)
如果您计划更改或移动文件,VB和C#答案很棒,但也包含“陷阱”:创建的'img'对象将锁定图像文件,除非调用dispose()方法释放它。见下文:
VB
Function IsValidImage(filename As String) As Boolean
Try
Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)
img.dispose() ' Removes file-lock of IIS
Catch generatedExceptionName As OutOfMemoryException
' Image.FromFile throws an OutOfMemoryException
' if the file does not have a valid image format or
' GDI+ does not support the pixel format of the file.
'
Return False
End Try
Return True
End Function
C#
static bool IsImageValid(string filename)
{
try
{
System.Drawing.Image img = System.Drawing.Image.FromFile(filename);
img.dispose(); // Removes file-lock of IIS
}
catch (OutOfMemoryException)
{
// Image.FromFile throws an OutOfMemoryException
// if the file does not have a valid image format or
// GDI+ does not support the pixel format of the file.
//
return false;
}
return true;
}
答案 4 :(得分:0)
最强大的方法是了解您需要加载的文件的签名。
JPEG具有特定的标题格式,例如。
这样,只要查看扩展名,您的代码就不会那么容易被愚弄。
163的回答应该可以帮助你完成这些工作。