图片判断文件格式

本文详细解析了JPEG、PNG、TGA等常见图片文件的头标识,并提供了加载图片时的判断策略,避免因文件后缀与内容不符导致的错误。通过代码示例展示了如何准确识别并处理不同格式的图片文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1, JPEG文件格式是以 {0XFF, 0XD8}开始,以{0XFF, 0XD9}结束

2, PNG开头是8字节的标识 {0X890X500X4E0X470X0D0X0A0X1A0X0A}


Opencv加载一幅图片的时候只看图片实际的图片格式,与后缀名无关;所以如果一幅图片实际是Opencv支持的图片格式,即使后缀名是txt也没关系。

但如果某个文件打着jpg的后缀名,但实际却是其他乱七八糟的格式,那么如果不加判断的cvLoadImage一幅“图片”,可能就会出错。出错的原因有:1.文件虽然是jpg等图片后缀,但实际不是图片,或者不是Opencv支持的图片----如gif;2.图片不完整(这种情况在读入之前是无法判断的,所以只好用try catch来解决了)。所以在load一幅图片之前最好添加一个判断操作

首先介绍一下图片文件头表示图片类型的部分:

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.PCX
- 文件头标识 (1 bytes)   0A

7.TIFF
- 文件头标识 (2 bytes)   4D 4D 或 49 49

8.ICO
- 文件头标识 (8 bytes)   00 00 01 00 01 00 20 20

9.CUR
- 文件头标识 (8 bytes)   00 00 02 00 01 00 20 20

10.IFF
- 文件头标识 (4 bytes)   46 4F 52 4D
                                         F   O  R  M

11.ANI
- 文件头标识 (4 bytes)   52 49 46 46
                                         R   I    F   F

对于图片的文件头,大家可以用winhex打开一幅图片就可以看到前面的几个字节。下面是读文件头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. }  


### 关于ESP8266的全面学习资料 #### ESP8266简介与功能详解 ESP8266是一款专为物联网(IoT)设计的Wi-Fi模块,具备强大的网络连接能力。此款微控制器不仅支持TCP/IP协议栈还提供了一系列用于处理字符串的API接口以及最佳实践指导[^1]。 对于基于ESP8266的应用开发而言,理解其内置函数库至关重要。这些库涵盖了从基本的数据类型定义到复杂的网络编程等多个方面: - **字符串操作**:包括创建、复制、拼接等常见任务; - **内存管理**:动态分配和释放堆空间的方法; - **串口通讯**:通过UART与其他设备交换数据的技术细节; - **网络安全特性**:确保传输过程中的信息安全措施; - **性能调优技巧**:提高应用程序运行效率的方式; - **错误恢复机制**:当遇到意外情况时如何优雅地应对并恢复正常服务; 以上各项内容均能在官方文档中找到详尽描述,并配有实际案例供参考学习。 #### 示例代码展示 为了更好地掌握上述知识点,在这里给出一段简单的Python风格伪代码来说明怎样利用ESP8266发送HTTP请求获取网页内容: ```python import urequests as requests # 导入轻量级http客户端库 def fetch_webpage(url): try: response = requests.get(url) # 发送GET请求至指定URL if response.status_code == 200: # 如果状态码表示成功,则打印页面主体部分 print(response.text) response.close() # 记得关闭连接以节省资源 except Exception as e: print(f"Error occurred while fetching webpage: {e}") ``` 这段代码展示了如何使用`urequests`这个专门为MicroPython环境定制的小型化版本requests库来进行标准HTTP GET请求的操作流程。它能够有效地简化原本较为繁琐的过程,让开发者可以更专注于业务逻辑本身而不是底层实现。 另外,还有更多实用的例子可以在开源项目【ESP8266-Demos】里发现,该项目包含了多个不同场景下的具体实施方案,非常适合用来加深理解和练习技能[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值