通过文件头判断图片格式

有些情况下,图片的后缀并不能真实的反应图片的格式,通过16进制能准确的判断出图片的真实格式。

事实上,所有的文件都是以二进制的形式进行存储的,本质上没有差别。在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)实际上都有一片区域来显示这个文件的实际用法,这就是文件头标志。

1、16进制查看

方法一:

1、右键图片,选择Editplus;
2、选择编码格式:Hex viewer (16进制查看);
3、对比文件头,分析出图片真实的格式。

方法二:
1、将一张图片的后缀修改成.txt,变成文本格式;
2、通过sublime打开这个TXT文件,显示就是十六进制码了;

// 常见的图片 文件头标志:
JPEG (jpg),文件头:FFD8FF 
PNG (png),文件头:89504E47 
GIF (gif),文件头:47494638 
TIFF (tif),文件头:49492A00 
Windows Bitmap (bmp),文件头:424D

文件头标志 表格

2、Base64查看(不准)

可以通过在线工具,将图片转换为base64字符串。(仅供参考)头部信息如下:

data:image/jpg;base64,/
data:image/png;base64,/
data:image/jpeg;base64,/
...

补充说明:
图片转base64,是根据文件名的后缀生成头部信息。

测试:将一个txt格式的文本强制改成.jpg,转换成base64时得到的头部信息是: data:image/jpg;base64,/…。

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
A: 可以使用以下步骤来判断文件所有图片格式文件类型: 1. 定义一个包含所有图片格式文件类型的数组,比如 { "jpg", "jpeg", "bmp", "png", "gif" }。 2. 打开文件,使用 fopen 函数和 "rb" (二进制读取) 模式来打开,例如: FILE* file = fopen("example.jpg", "rb"); 3. 读取文件前面几个字节(通常是文件),根据文件的不同,可以用文件判断文件类型。例如,JPG 文件文件是 "FF D8",PNG 文件文件是 "89 50 4E 47 0D 0A 1A 0A"。 4. 根据文件判断文件类型,可以使用 memcmp 函数来比较字节数组,例如: unsigned char header[8]; fread(header, sizeof(unsigned char), 8, file); if (memcmp(header, "\xFF\xD8", 2) == 0) { // JPG 文件 } else if (memcmp(header, "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", 8) == 0) { // PNG 文件 } // 其他文件类型类似 5. 关闭文件,使用 fclose 函数关闭文件,例如: fclose(file); 下面是示例代码: ``` #include <stdio.h> #include <string.h> int is_image_file(const char* filename) { FILE* file = fopen(filename, "rb"); if (!file) { return 0; } unsigned char header[8]; fread(header, sizeof(unsigned char), 8, file); fclose(file); const char* exts[] = { "jpg", "jpeg", "bmp", "png", "gif" }; const char* headers[][2] = { { "\xFF\xD8", "\xFF\xD9" }, // JPG/JPEG 文件和尾 { "\x42\x4D", NULL }, // BMP 文件 { "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", NULL }, // PNG 文件 { "\x47\x49\x46\x38\x37\x61", "\x47\x49\x46\x38\x39\x61" }, // GIF87a/GIF89a 文件和尾 }; const size_t num_exts = sizeof(exts) / sizeof(exts[0]); const size_t num_headers = sizeof(headers) / sizeof(headers[0]); size_t i, j; for (i = 0; i < num_exts; i++) { if (strstr(filename, exts[i])) { for (j = 0; j < num_headers; j++) { if (memcmp(header, headers[j][0], strlen(headers[j][0])) == 0 && (!headers[j][1] || memcmp(header + 2, headers[j][1], strlen(headers[j][1])) == 0)) { return 1; } } break; } } return 0; } int main() { const char* filename = "example.jpg"; if (is_image_file(filename)) { printf("%s is an image file.\n", filename); } else { printf("%s is not an image file.\n", filename); } return 0; } ``` 注意:以上代码只是一个示例,可能会有一些特殊情况没有考虑到,需要在实际使用中进行测试和改进。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值