C#, Как я могу протестировать файл, является jpeg?

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

31
задан 21 April 2009 в 12:45
поделиться

12 ответов

Несколько вариантов:

Вы можете проверить расширение файла:

static bool HasJpegExtension(string filename)
{
    // add other possible extensions here
    return Path.GetExtension(filename).Equals(".jpg", StringComparison.InvariantCultureIgnoreCase)
        || Path.GetExtension(filename).Equals(".jpeg", StringComparison.InvariantCultureIgnoreCase);
}

или проверить правильное магическое число в заголовке файла:

static bool HasJpegHeader(string filename)
{
    using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open, FileAccess.Read)))
    {
        UInt16 soi = br.ReadUInt16();  // Start of Image (SOI) marker (FFD8)
        UInt16 marker = br.ReadUInt16(); // JFIF marker (FFE0) or EXIF marker(FFE1)

        return soi == 0xd8ff && (marker & 0xe0ff) == 0xe0ff;
    }
}

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

static bool IsJpegImage(string filename)
{
    try
    {
        using (System.Drawing.Image img = System.Drawing.Image.FromFile(filename)) 
        {           
            // Two image formats can be compared using the Equals method
            // See http://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageformat.aspx
            //
            return img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg);
        }
    }
    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;
    }
}
102
ответ дан 27 November 2019 в 21:19
поделиться

Лучше всего попытаться создать из него изображение с помощью конструктора Drawing.Bitmap (string) и посмотреть, он не может этого сделать или выдает исключение. Проблема с некоторыми ответами заключается в следующем: во-первых, расширение является произвольным, это может быть jpg, jpeg, jpe, bob, tim, что угодно. Во-вторых, просто использовать заголовок недостаточно для 100% уверенности. Он может определенно определить, что файл не является JPEG, но не может гарантировать, что файл является JPEG, произвольный двоичный файл может иметь одинаковую последовательность байтов в начале.

0
ответ дан 27 November 2019 в 21:19
поделиться

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

Быстрый и грязный способ - попытаться загрузить изображение с помощью класса Image и перехватить любые исключения:

Image image = Image.FromFile(@"c:\temp\test.jpg");

Это не идеально, как вы могли бы получить любое исключение, такое как OutOfMemoryException, FileNotFoundException и т. д. и т. д.

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

0
ответ дан 27 November 2019 в 21:19
поделиться

Это будет циклически проходить через каждый файл в текущем каталоге и выводить, если найденные файлы с расширением JPG или JPEG имеют формат Jpeg. images.

      foreach (FileInfo f in new DirectoryInfo(".").GetFiles())
        {
            if (f.Extension.ToUpperInvariant() == ".JPG"
                || f.Extension.ToUpperInvariant() == ".JPEG")
            {
                Image image = Image.FromFile(f.FullName);

                if (image.RawFormat == ImageFormat.Jpeg)
                {
                    Console.WriteLine(f.FullName + " is a Jpeg image");
                }
            }
        }
1
ответ дан 27 November 2019 в 21:19
поделиться

Вы можете использовать метод Path.GetExtension .

0
ответ дан 27 November 2019 в 21:19
поделиться

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

(Ссылка на запись в блоге Рэймонда Чена.)

1
ответ дан 27 November 2019 в 21:19
поделиться

Код здесь:

http://mark.michaelis.net/Blog/RetrievingMetaDataFromJPEGFilesUsingC.aspx

Показывает, как получить метаданные. Я полагаю, это приведет к исключению, если ваше изображение не будет правильным JPEG.

0
ответ дан 27 November 2019 в 21:19
поделиться

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

^.*\.(jpg|JPG)$
1
ответ дан 27 November 2019 в 21:19
поделиться

Прочитать байты заголовка. Эта статья содержит информацию о нескольких распространенных форматах изображений, включая JPEG:

Использование заголовков файлов изображений для проверки формата изображений

Информация о заголовках JPEG

3
ответ дан 27 November 2019 в 21:19
поделиться

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

4
ответ дан 27 November 2019 в 21:19
поделиться

Вы можете попробовать загрузить файл в изображение и затем проверить формат

Image img = Image.FromFile(filePath);
bool isBitmap = img.RawFormat.Equals(ImageFormat.Jpeg);

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

13
ответ дан 27 November 2019 в 21:19
поделиться

Откройте файл в виде потока и найдите магическое число для JPEG.

Файлы изображений JPEG начинаются с FF D8 и конец с FF D9. Файлы JPEG / JFIF содержит код ASCII для 'JFIF' (4A 46 49 46) как завершенная нулем строка. Файлы JPEG / Exif содержат код ASCII для «Exif» (45 78 69 66) также как строка с нулевым символом в конце

28
ответ дан 27 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: