识别图像文件格式

时间:2009-07-29 19:53:40

标签: c++ image

给定没有扩展名的图像文件,如何读取图像文件并用C ++识别文件格式?

5 个答案:

答案 0 :(得分:6)

您可以检查Linux file命令(git://git.debian.net/git/debian/file.git)的来源。它完全一样;而不只是图像文件。

答案 1 :(得分:5)

通过读取前几个字节,您可以猜测,但需要尝试完全解析才能确定。以下是我可以用作参考的图像加载对象的一些代码:

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

答案 2 :(得分:1)

老派问题;) 您需要检查该文件中所谓的“幻数”。换句话说,几乎每个二进制文件类型在文件的开头都有一些常量代码。首先,你需要hex查看器: www.hhdsoftware.com/Products/home/hex-editor-free.html

然后在这里搜索: www.garykessler.net/library/file_sigs.html

答案 3 :(得分:1)

研究文件命令的来源可能很有用,但大多数魔法都是由...... libmagic!

完成的。

答案 4 :(得分:0)

我找到了一种简单的方法来计算特殊文件类型的魔术字节:

  1. 我需要一些相同类型的文件,例如BMP
  2. 我读出了每个文件的前128个字节并将其保存在网格中
  3. 我发现哪个字节(列)相等,这些字节和位置是明显的“魔术字节”
  4. 例如

    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 ...

    magicbytes:13 - - 17 - 00 - ...

    但是不能保证这种类型的其他文件具有这些神奇的字节 因此我使用了一个概率范围:如果文件中有80%的魔法字节到达,那么它可能就是这种类型的文件。

    这个网格数据可以存储在一个文件中,文件类型分析器可以“学习”找出每个分析