给定没有扩展名的图像文件,如何读取图像文件并用C ++识别文件格式?
答案 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)
我找到了一种简单的方法来计算特殊文件类型的魔术字节:
例如
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%的魔法字节到达,那么它可能就是这种类型的文件。
这个网格数据可以存储在一个文件中,文件类型分析器可以“学习”找出每个分析