天天看點

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

繼續閱讀