Является ли файл изображением? - PullRequest
11 голосов
/ 24 марта 2009

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

Ответы [ 8 ]

10 голосов
/ 24 марта 2009

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

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

7 голосов
/ 24 марта 2009

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

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;
}

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

5 голосов
/ 24 марта 2009

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

bool isImage;
try
{
  Bitmap.FromFile(filePath);
  isImage = true;
}
catch
{
  isImage = false;
}
4 голосов
/ 24 марта 2009

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

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

// 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
2 голосов
/ 24 марта 2009

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

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

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

2 голосов
/ 24 марта 2009

У большинства файлов изображений есть волшебный байт или два в самом начале файла. Это используется декодерами и программами просмотра изображений для определения типа файла. Ни одно правило не может вам помочь.

1 голос
/ 24 марта 2009

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

0 голосов
/ 24 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...