天天看点

C++ 判断png / jpg文件是否格式正确

这边按照文件头的方式判断图片格式是否正常,需要加强容错可增加上文件尾判断。

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;
}
           

继续阅读