這邊按照檔案頭的方式判斷圖檔格式是否正常,需要加強容錯可增加上檔案尾判斷。
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;
}