读文件头判断图片类型

  各种格式的图片都有特定的文件头标识,通过这个可以在载入一个图片数据时判断其图片类型。首先介绍一下图片文件头表示图片类型的部分:

(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里面。

  1. enum ImageType{  
  2.     jpg,  
  3.     bmp,  
  4.     png,  
  5.     nothing  
  6. };  
  7. ImageType image_type(const char* path)  
  8. {  
  9.     ifstream inFile(path);  
  10.     uchar png_type[9] = {0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,'/0'};  
  11.     uchar file_head[9];  
  12.     for (int i=0;i<8;++i)  
  13.     {  
  14.         inFile>>file_head[i];  
  15.     }  
  16.     file_head[8] = '/0';  
  17.     switch (file_head[0])  
  18.     {  
  19.     case 0xff:  
  20.         if (file_head[1]==0xd8)  
  21.             return jpg;//jpeg   
  22.     case 0x42:  
  23.         if (file_head[1]==0x4D)  
  24.             return bmp;//bmp   
  25.     case 0x89:  
  26.         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]&&  
  27.             file_head[5]==png_type[5] && file_head[6]==png_type[6] && file_head[7]==png_type[7])  
  28.             return png;//png   
  29.     default:  
  30.         return nothing;  
  31.     }  
  32. }  
enum ImageType{
	jpg,
	bmp,
	png,
	nothing
};
ImageType image_type(const 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[i];
	}
	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存放:低字低字节,低字高字节,高字低字节,高字高字节。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值