| 
 各种格式的图片都有特定的文件头标识,通过这个可以在载入一个图片数据时判断其图片类型。首先介绍一下图片文件头表示图片类型的部分: (1)JPEG 
- 文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识) 
- 文件结束标识 (2 bytes): 0xff, 0xd9 (EOI) 
(2)TGA 
- 未压缩的前5字节    00 00 02 00 00 
- RLE压缩的前5字节   00 00 10 00 00 
(3)PNG 
- 文件头标识 (8 bytes)   89 50 4E 47 0D 0A 1A 0A 
(4)GIF 
- 文件头标识 (6 bytes)   47 49 46 38 39(37) 61,字符即:   G    I   F   8    9 (7)   a 
(5)BMP 
- 文件头标识 (2 bytes)   42 4D,字符即:        B  M 
(6)TIFF 
- 文件头标识 (2 bytes)   4D 4D 或 49 49 
(7)ICO 
- 文件头标识 (8 bytes)   00 00 01 00 01 00 20 20 
(8)CUR 
- 文件头标识 (8 bytes)   00 00 02 00 01 00 20 20 (1)对于图片的文件头,大家可以用UE打开一幅图片就可以看到前面的几个字节。下面是读文件头8个字节然后判断图片类型的函数,因为这里我只需要jpeg/bmp/png格式的,所以其他格式的即使是图片也归到nothing里面。 [cpp] view plain copy 
 
 
- enum ImageType{  
 -     jpg,  
 -     bmp,  
 -     png,  
 -     nothing  
 - };  
 - ImageType image_type(c**t char* path)  
 - {  
 -     ifstream inFile(path);  
 -     uchar png_type[9] = {0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,'/0'};  
 -     uchar file_head[9];  
 -     for (int i=0;i<8;++i)  
 -     {  
 -         inFile>>file_head;  
 -     }  
 -     file_head[8] = '/0';  
 -     switch (file_head[0])  
 -     {  
 -     case 0xff:  
 -         if (file_head[1]==0xd8)  
 -             return jpg;//jpeg  
 -     case 0x42:  
 -         if (file_head[1]==0x4D)  
 -             return bmp;//bmp  
 -     case 0x89:  
 -         if (file_head[1]==png_type[1] && file_head[2]==png_type[2] && file_head[3]==png_type[3] && file_head[4]==png_type[4]&&  
 -             file_head[5]==png_type[5] && file_head[6]==png_type[6] && file_head[7]==png_type[7])  
 -             return png;//png  
 -     default:  
 -         return nothing;  
 -     }  
 - }  
 
 
 
  
(2)位图判断          通过UE打开BMP,看到的文件头内容是“B”“M”,对应的ASCII码是0x42,0x4d,但是判断其内容则是通过0x4d42=19778,而不是0x424d=16973判断的。原因是跟存储顺序有关,如WORD存放: 低字节,高字节。DWORD存放:低字低字节,低字高字节,高字低字节,高字高字节。  
 |