这边按照文件头的方式判断图片格式是否正常,需要加强容错可增加上文件尾判断。
JPEG (jpg):
文件头:FF D8 FF
文件尾:FF D9
PNG (png):
文件头:89 50 4E 47
文件尾:AE 42 60 82
代码:
bool checkImgFormat(string pic)
{
FILE *fp = fopen(pic.c_str(), "r");
if (fp == nullptr) return false;
int result = 0;
// 跳到文件头
result = fseek(fp, 0, SEEK_SET);
if (result < 0)
{
fclose(fp);
fp = nullptr;
return false;
}
// 读取前三个字节
char fileHeader[4];
memset(fileHeader, 0 , sizeof(fileHeader));
result = fread(fileHeader, 1, 3, fp);
if (result < 3)
{
fclose(fp);
fp = nullptr;
return false;
}
// 如果文件后缀为png,匹配 89 50 4E
// 如果文件后缀为jpg,匹配 FF D8 FF
if (pic.find(".png") != string::npos)
{
if (fileHeader[0] == 0x89 || fileHeader[1] == 0x50 || fileHeader[2] == 0x4E)
{
fclose(fp);
fp = nullptr;
return true;
}
}
else if (pic.find(".jpg") != string::npos)
{
if (fileHeader[0] == 0xFF || fileHeader[1] == 0xD8 || fileHeader[2] == 0xFF)
{
fclose(fp);
fp = nullptr;
return true;
}
}
fclose(fp);
fp = nullptr;
return false;
}