Является ли файл образным?

В С# каков наилучший способ определить, является ли конкретный файл изображением?

Ответ 1

В большинстве форматов изображений указывается тип файла в первых байтах изображения. Вы можете читать в нескольких байтах и ​​искать правильные заголовки.

Расширения файлов технически не содержат никаких важных данных об изображении. Это просто помогает ОС понять, какую программу использовать для ее открытия. (Но, проверка extn, вероятно, самый простой способ и, как правило, правильный.)

Ответ 2

Это не проверено, но это примерно так:

private string MimeType (string Filename)
{
    string mime = "[default]";
    string ext = GetExtension(Filename).ToLower();
    Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
    if (rk != null && rk.GetValue("Content Type") != null)
        mime = rk.GetValue("Content Type").ToString();
    return mime;
}

(Извините, прошло некоторое время с тех пор, как я сделал записи реестра)

Ответ 3

Как мы это сделали (и я не могу найти точный код прямо сейчас, поэтому следующее непроверено) заключается в попытке загрузить изображение в виде растрового изображения. Если это не удается, это не изображение

bool isImage;
try
{
  Bitmap.FromFile(filePath);
  isImage = true;
}
catch
{
  isImage = false;
}

Ответ 4

Я не думаю, что есть какой-либо способ гарантировать, что данный файл (или любой набор байтов) обязательно представляет изображение, отличное от попытки загрузить и отобразить его.

Однако, если у вас есть некоторые тайные байты, вы всегда можете проверить определенные байтовые подписи, чтобы попытаться вывести, если это хорошо сформированный файл изображения. Вы можете искать заголовки файлов в wikipedia, но здесь некоторый код, который я использую в модульном тестировании, для проверки вывода стороннего средства отчетности:

// Some signatures:

const string _pdfSignature = "%PDF-";
readonly byte[] _bmpSignature = new byte[2] { 0x42, 0x4D };
readonly byte[] _pngSignature = new byte[8] {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};
readonly byte[] _gifSignature = new byte[6] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 };

И для JPG:

Assert.That(_theBytes[0] == 0xFF && _theBytes[1] == 0xD8);    //Start of jpg file
Assert.That(_theBytes[_theBytes.Length - 2] == 0xFF && _theBytes[_theBytes.Length - 1] == 0xD9); //End of jpg file

Ответ 5

Большинство файлов изображений имеют магический байт или два в самом начале файла. Это используется декодерами и зрителями изображений для идентификации типа файла. Существует не одно правило, которое может вам помочь.

Ответ 6

Если вам нужно подтвердить, что файл является допустимым форматом изображения, тогда вам нужно будет попробовать какой-то код и проанализировать содержимое в соответствии с типом файла, который вы ожидаете. Чтобы сделать это, вы должны вызвать статический метод FromFile в классе Image, чтобы попытаться получить экземпляр изображения.

Вы можете проверить первые несколько байтов, чтобы увидеть, существует ли маркер для определенного формата изображения, но точно так же, как проверка расширения файла, это не гарантирует, что содержимое является допустимым форматом изображения.

Если вам не нужна проверка, хотя проверка расширения файла или типа mime просто прекрасна.

Ответ 7

проверить расширение файла

Ответ 8

По общему признанию, я не слишком много сделал с этим, но разве это не просто поиск мимического типа?

http://www.iana.org/assignments/media-types/