Заметили проблему со всеми вышеперечисленными функциями. Прежде всего - изображение.FromFile открывает данное изображение, а затем вызывает открытую ошибку файла, кто бы ни захотел открыть данный файл изображения по какой-либо причине. Даже само приложение - поэтому я переключился с помощью Image.FromStream.
После того, как вы переключите api - тип исключения изменится с OutOfMemoryException на ArgumentException для некоторых неясных причин. (Возможно, ошибка сети .net)?
Также, если .net добавит больше форматов файлов изображений, чем в настоящее время, мы проверим по функциям - имеет смысл сначала попробовать загрузить изображение, если только если затем не удастся - только после этого сообщить ошибка.
Так что мой код теперь выглядит так:
try {
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
Image im = Image.FromStream(stream);
// Do something with image if needed.
}
}
catch (ArgumentException)
{
if(!IsValidImageFormat(path))
return SetLastError("File '" + fileName + "' is not a valid image");
throw;
}
Где:
/// <summary>
/// Check if we have valid Image file format.
/// </summary>
/// <param name="path"></param>
/// <returns>true if it's image file</returns>
public static bool IsValidImageFormat(String path)
{
using (FileStream fs = File.OpenRead(path))
{
byte[] header = new byte[10];
fs.Read(header, 0, 10);
foreach (var pattern in new byte[][] {
Encoding.ASCII.GetBytes("BM"),
Encoding.ASCII.GetBytes("GIF"),
new byte[] { 137, 80, 78, 71 }, // PNG
new byte[] { 73, 73, 42 }, // TIFF
new byte[] { 77, 77, 42 }, // TIFF
new byte[] { 255, 216, 255, 224 }, // jpeg
new byte[] { 255, 216, 255, 225 } // jpeg canon
})
{
if (pattern.SequenceEqual(header.Take(pattern.Length)))
return true;
}
}
return false;
} //IsValidImageFormat
Почему бы не обернуть этот код в Try ... Catch блок, и если он бросает это исключение, вы можете считать его «недействительным»? Конечно, это наивная эвристика, но она выполняет эту работу. Все остальное должно будет открыть файл, поэтому вы не будете экономить значительную часть производительности независимо от ИМО. – 2008-10-16 23:41:24
См. Также: http://stackoverflow.com/questions/9354747/how-can-i-determine-if-a-file-is-an-image-file-in-net – Daryl 2013-03-05 21:41:22