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