определить формат файла изображения - PullRequest
1 голос
/ 29 июля 2009

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

Ответы [ 5 ]

6 голосов
/ 30 июля 2009

Вы можете проверить источник команды Linux file (git://git.debian.net/git/debian/file.git). Это делает то же самое; и не только для файлов изображений.

5 голосов
/ 30 июля 2009

Читая первые несколько байтов, вы можете получить предположение, но для полной уверенности потребуется попытаться выполнить полный анализ Вот код из одного из моих объектов загрузки изображений, который вы можете использовать для справки:

    if(Open()==true)
    {
        unsigned char testread[5];

        if(Read(&testread,(unsigned long)4)==4)
        {
            testread[4]=0;
            if(!strcmp((char *)testread,"GIF8"))
            {
                Close();
                LoadGIFImage(justsize);
            }
            else if(testread[0]==0xff && testread[1]==0xd8)
            {
                Close();
                LoadJPGImage(justsize);
            }
            else if(testread[0]==0x89 && testread[1]==0x50 && testread[2]==0x4e && testread[3]==0x47)
            {
                Close();
                LoadPNGImage(justsize);
            }
            else if(testread[0]==0x00 && testread[1]==0x00 && testread[2]==0x01 && testread[3]==0x00)
            {
                Close();
                LoadWINICOImage(justsize);
            }
            else if(testread[0]==0x42 && testread[1]==0x4d)
            {
                Close();
                LoadBMPImage(justsize);
1 голос
/ 02 февраля 2011

Изучение источника команды file может быть полезным, но большая часть магии выполняется ... libmagic!

1 голос
/ 30 июля 2009

Старый школьный вопрос;) Вам нужно проверить так называемые «магические числа» в этом файле. Другими словами, почти каждый тип двоичного файла имеет некоторый постоянный код в начале файла. Во-первых, для этого вам нужен шестнадцатеричный просмотрщик: www.hhdsoftware.com/Products/home/hex-editor-free.html

И тогда ищите здесь: www.garykessler.net/library/file_sigs.html

0 голосов
/ 08 октября 2012

Я нашел простой способ выяснить магические байты специального типа файла:

  1. Мне нужны файлы одного типа, например, BMP
  2. Я считываю первые 128 байтов каждого файла и сохраняю его в сетке
  3. Я нашел, какие из байтов (столбцов) равны, и эти байты и их позиции являются очевидными "магическими байтами"

Пример

file1.bmp: 13 14 16 17 00 00 00 ... file2.bmp: 13 15 16 17 01 00 02 ... file3.bmp: 13 16 14 17 02 00 10 ...

магических байтов: 13 - - 17 - 00 - ...

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

Эти данные сетки могут храниться в файле или около того, и анализатор типов файлов может «научиться» вычислять по каждому анализу

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