Click here to Skip to main content
15,891,734 members
Articles / Desktop Programming / MFC

Image Classification Using File Header Information

Rate me:
Please Sign up or sign in to vote.
2.72/5 (9 votes)
12 May 20061 min read 62.3K   1.2K   21  
How to do image classification using file header information.
// IdentifyImageFile.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

// Define file headers here
char szTiffHeaderForMotorola[]	= "MM*";
char szTiffHeaderForIntel[]		= "II*";
char szPNGHeader[]				= "\x89PNG\r\n\x1a\n";
char szGIF87aHeader[]			= "GIF87a";
char szGIF89aHeader[]			= "GIF89a";
char szJPEGCommonHeader[]		= "\xFF\xD8\xFF"; // this part of the header 
char szJPEGCommonEOI[]			= "\xFF\xD9"; // for future use
char szBMPHeader[]				= "\x42\x4D"; // followinf 4 bytes will be size and the 4 will be 0

/*char szJPEGJFIFHeader[]			= "\xFF\xD8\xFF\xE0\x0";//\x10JFIF"; NOT REQUIRED APP0
char szJPEGEXIFHeader[]			= "\xFF\xD8\xFF\xE1"; // APP1
char szJPEGAPP2Header[]			= "\xFF\xD8\xFF\xE2"; // APP2
char szJPEGAPP3Header[]			= "\xFF\xD8\xFF\xE3";
char szJPEGAPP4Header[]			= "\xFF\xD8\xFF\xE4";
char szJPEGAPP5Header[]			= "\xFF\xD8\xFF\xE5";
char szJPEGAPP6Header[]			= "\xFF\xD8\xFF\xE6";
char szJPEGAPP7Header[]			= "\xFF\xD8\xFF\xE7";
char szJPEGAPP8Header[]			= "\xFF\xD8\xFF\xE8";
char szJPEGAPP9Header[]			= "\xFF\xD8\xFF\xE9";
char szJPEGAPPAHeader[]			= "\xFF\xD8\xFF\xEA";
char szJPEGAPPBHeader[]			= "\xFF\xD8\xFF\xEB";
char szJPEGAPPCHeader[]			= "\xFF\xD8\xFF\xEC";
char szJPEGAPPDHeader[]			= "\xFF\xD8\xFF\xED";
char szJPEGAPPEHeader[]			= "\xFF\xD8\xFF\xEE";
char szJPEGAPPFHeader[]			= "\xFF\xD8\xFF\xEF"; // APPF
*/

// Image Types defined here
#define TIFFINTEL		1
#define TIFFMOTOROLA	2
#define GIF87a			3
#define GIF89a			4
#define PNG				5
#define JPEGJFIF		6
#define JPEGEXIF		7
#define JPEGAPP2		8
#define JPEGAPP3		9
#define JPEGAPP4		10
#define JPEGAPP5		11
#define JPEGAPP6		12
#define JPEGAPP7		13
#define JPEGAPP8		14
#define JPEGAPP9		15
#define JPEGAPPA		16
#define JPEGAPPB		17
#define JPEGAPPC		18
#define JPEGAPPD		19
#define JPEGAPPE		20
#define JPEGAPPF		21
#define BITMAP			22

int DisplayImageType(char *);

int _tmain(int argc, _TCHAR* argv[])
{
	int File; // file descriptor
	char pbData[10]; // buffer to reader file headers
	int nImageType = 0;

	if (argc > 1)
	{
		// start from 1 because 0 index point to exe it self
		for(int nNumberOfFileProcessed=1; nNumberOfFileProcessed<argc; 
			nNumberOfFileProcessed++)
		{
			File = _open(argv[nNumberOfFileProcessed],_O_BINARY);
			// read 10 bytes
			_read(File, pbData,10); 
            
			if (!(nImageType = DisplayImageType(pbData)))
				std::cout.write("Sorry, Unable to find image type.",(int)strlen("Sorry, Unable to find image type."));
			else {
				switch(nImageType)
				{
				case TIFFINTEL:
					std::cout.write("Tiff image for Intel processor\n",(int)strlen("Tiff image for Intel processor\n"));
					break;
				case TIFFMOTOROLA:
					std::cout.write("Tiff image for Motorola processor\n",(int)strlen("Tiff image for Motorola processor\n"));
					break;
				case GIF87a:
					std::cout.write("GIF87a Image\n",(int)strlen("GIF87a Image\n"));
					break;
				case GIF89a:
					std::cout.write("GIF89a Image\n",(int)strlen("GIF89a Image\n"));
					break;
				case PNG:
					std::cout.write("PNG Image\n",(int)strlen("PNG Image\n"));
					break;
				case JPEGJFIF:
					std::cout.write("JPEG JFIF compliant image\n",(int)strlen("JPEG JFIF compliant image\n"));
					break;
				case JPEGEXIF:
					std::cout.write("JPEG EXIF compliant image\n",(int)strlen("JPEG EXIF compliant image\n"));
					break;
				case JPEGAPP2:
					std::cout.write("JPEG with APP2 marker\n",(int)strlen("JPEG with APP2 marker\n"));
					break;
				case JPEGAPP3:
					std::cout.write("JPEG with APP3 marker\n",(int)strlen("JPEG with APP3 marker\n"));
					break;
				case JPEGAPP4:
					std::cout.write("JPEG with APP4 marker\n",(int)strlen("JPEG with APP4 marker\n"));
					break;
				case JPEGAPP5:
					std::cout.write("JPEG with APP5 marker\n",(int)strlen("JPEG with APP5 marker\n"));
					break;
				case JPEGAPP6:
					std::cout.write("JPEG with APP6 marker\n",(int)strlen("JPEG with APP6 marker\n"));
					break;
				case JPEGAPP7:
					std::cout.write("JPEG with APP7 marker\n",(int)strlen("JPEG with APP7 marker\n"));
					break;
				case JPEGAPP8:
					std::cout.write("JPEG with APP8 marker\n",(int)strlen("JPEG with APP8 marker\n"));
					break;
				case JPEGAPP9:
					std::cout.write("JPEG with APP9 marker\n",(int)strlen("JPEG with APP9 marker\n"));
					break;
				case JPEGAPPA:
					std::cout.write("JPEG with APPA marker\n",(int)strlen("JPEG with APPA marker\n"));
					break;
				case JPEGAPPB:
					std::cout.write("JPEG with APPB marker\n",(int)strlen("JPEG with APPB marker\n"));
					break;
				case JPEGAPPC:
					std::cout.write("JPEG with APPC marker\n",(int)strlen("JPEG with APPC marker\n"));
					break;
				case JPEGAPPD:
					std::cout.write("JPEG with APPD marker\n",(int)strlen("JPEG with APPD marker\n"));
					break;
				case JPEGAPPE:
					std::cout.write("JPEG with APPE marker\n",(int)strlen("JPEG with APPE marker\n"));
					break;
				case JPEGAPPF:
					std::cout.write("JPEG with APPF marker\n",(int)strlen("JPEG with APPF marker\n"));
					break;
				case BITMAP:
					std::cout.write("Bitmap file\n",(int)strlen("Bitmap file\n"));
					break;
				default:
					break;
				}
			}

			_close(File);
		}
	}
	else // on command line there is no argument given
		std::cout.write("No image file has been passed as an argument",(int)strlen("No image file"));

	return 0;
}

int DisplayImageType(char *pData)
{
	// compare file headers to determine the file type
	if (!memcmp(pData, szTiffHeaderForIntel,3))
		return TIFFINTEL;
	else if (!memcmp(pData, szTiffHeaderForMotorola,3))
		return TIFFMOTOROLA;
	else if (!memcmp(pData, szPNGHeader,8))
		return PNG;
	else if (!memcmp(pData, szGIF87aHeader,6))
		return GIF87a;
	else if (!memcmp(pData, szGIF89aHeader,6))
		return GIF89a;
	else if (!memcmp(pData, szBMPHeader,2))
	{
		// 7 to ten byte must be zero
		// 3 to 6 is size of image
		char szNull[] = "\x0\x0\x0\x0";
		if (!memcmp(pData+6, szNull,4))
			return BITMAP;
	}
	else if (!memcmp(pData, szJPEGCommonHeader,3))
	{
		switch (((long)*(pData+3)) & 0xFF)
		{
		case 0xE0:
			return JPEGJFIF;
			break;
		case 0xE1:
			return JPEGEXIF;
			break;
		case 0xE2:
			return JPEGAPP2;
			break;
		case 0xE3:
			return JPEGAPP3;
			break;
		case 0xE4:
			return JPEGAPP4;
			break;
		case 0xE5:
			return JPEGAPP5;
			break;
		case 0xE6:
			return JPEGAPP6;
			break;
		case 0xE7:
			return JPEGAPP7;
			break;
		case 0xE8:
			return JPEGAPP8;
			break;
		case 0xE9:
			return JPEGAPP9;
			break;
		case 0xEA:
			return JPEGAPPA;
			break;
		case 0xEB:
			return JPEGAPPB;
			break;
		case 0xEC:
			return JPEGAPPC;
			break;
		case 0xED:
			return JPEGAPPD;
			break;
		case 0xEE:
			return JPEGAPPE;
			break;
		case 0xEF:
			return JPEGAPPF;
			break;
		default:
			break;
		}
	}
/*	else if (!memcmp(pData, szJPEGEXIFHeader,4))
		return JPEGEXIF;
	else if (!memcmp(pData, szJPEGAPP2Header,4))
		return JPEGAPP2;
	else if (!memcmp(pData, szJPEGAPP3Header,4))
		return JPEGAPP3;
	else if (!memcmp(pData, szJPEGAPP4Header,4))
		return JPEGAPP4;
	else if (!memcmp(pData, szJPEGAPP5Header,4))
		return JPEGAPP5;
	else if (!memcmp(pData, szJPEGAPP6Header,4))
		return JPEGAPP6;
	else if (!memcmp(pData, szJPEGAPP7Header,4))
		return JPEGAPP7;
	else if (!memcmp(pData, szJPEGAPP8Header,4))
		return JPEGAPP8;
	else if (!memcmp(pData, szJPEGAPP9Header,4))
		return JPEGAPP9;
	else if (!memcmp(pData, szJPEGAPPAHeader,4))
		return JPEGAPPA;
	else if (!memcmp(pData, szJPEGAPPBHeader,4))
		return JPEGAPPB;
	else if (!memcmp(pData, szJPEGAPPCHeader,4))
		return JPEGAPPC;
	else if (!memcmp(pData, szJPEGAPPDHeader,4))
		return JPEGAPPD;
	else if (!memcmp(pData, szJPEGAPPEHeader,4))
		return JPEGAPPE;
	else if (!memcmp(pData, szJPEGAPPFHeader,4))
		return JPEGAPPF;*/
	// no comparison found
	return false;
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Product Manager Sivia Technologies
Germany Germany
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions