#define SOI_MK 0xFFD8 /* start of image */ #define APP_MK 0xFFE0 /* custom, up to FFEF */ #define COM_MK 0xFFFE /* commment segment */ #define SOF_MK 0xFFC0 /* start of frame */ #define SOS_MK 0xFFDA /* start of scan */ #define DHT_MK 0xFFC4 /* Huffman table */ #define DQT_MK 0xFFDB /* Quant. table */ #define DRI_MK 0xFFDD /* restart interval */ #define EOI_MK 0xFFD9 /* end of image */ #define MK_MSK 0xFFF0 #define get_size(fi) (((unsigned int)Image[fi]) << 8) + (unsigned int)Image[fi+1] unsigned char GetJPEGHeaderInfo (unsigned char *Image,unsigned int *offset,unsigned int *x_size,unsigned int *y_size, unsigned char *depth) { unsigned int aux; int hCounter = 0, hAantal; /* First find the SOI marker: */ aux = get_size(hCounter); hCounter+=2; if (aux != SOI_MK) { printf("INFO:\tNO SOI marker!\n"); return 0;} printf("%ld:\tINFO:\tFound the SOI marker!\n", hCounter); /* Read first marker */ while( (aux != EOI_MK) && (aux != 0)) { aux = get_size(hCounter); hCounter+=2; switch(aux) { case APP_MK: hAantal = get_size(hCounter); printf("\tJFIF marker - APP0 Marker size: %i Count: %i\n", hAantal,hCounter); printf("\tversion: %02x%02x units %x Xdensity %i Ydensity %i Xthumbnail %i Ythumbnail %i", Image[hCounter+7],Image[hCounter+8],Image[hCounter+9],get_size(hCounter+10),get_size(hCounter+12) ,Image[hCounter+14],Image[hCounter+15]); hCounter = hCounter + hAantal; break; case COM_MK: hAantal = get_size(hCounter); printf("\tcommment segment Marker size: %i Count: %i\n", hAantal,hCounter); hCounter = hCounter + hAantal; break; case SOF_MK: hAantal= get_size(hCounter); /* header size */ printf("\tSOF: %i Count: %i\n", hAantal,hCounter); hAantal= hCounter + get_size(hCounter); hCounter+=2; /* load basic image parameters */ hCounter++; /* precision, 8bit, don't care */ *y_size = get_size(hCounter); hCounter+=2; *x_size = get_size(hCounter); hCounter+=2; printf("\tINFO:\tImage size is %d by %d\n", *x_size, *y_size); *depth = Image[hCounter]; /* # of components */ printf("\tINFO:\t"); switch (*depth) { case 1: printf("Monochrome"); break; case 3: printf("Color"); break; default: printf("Not a"); break; } printf(" JPEG image!\n"); hCounter = hAantal; break; case DHT_MK: hAantal = get_size(hCounter); printf("\tHuffman table size: %i Count: %i\n", hAantal,hCounter); hCounter = hCounter + hAantal; break; case DQT_MK: hAantal = get_size(hCounter); printf("\tQuant. table size: %i Count: %i\n", hAantal,hCounter); hCounter = hCounter + hAantal; break; default: hAantal = get_size(hCounter); printf("\tOverig nl: %04X Count: %i, aantal: %i\n", aux,hCounter, hAantal); hCounter = hCounter + get_size(hCounter); } } printf("\tEinde op: aux: %04X Count: %i \n", aux, hCounter); return 1; } unsigned char WriteJPEGHeaderInfo (unsigned char *Image,unsigned int offset,unsigned int x_size,unsigned int y_size, unsigned char depth) { // SOI marker + JFIF marker - APP0 Marker size: 16 Count: 4 // version: 0102 units 1 Xdensity 300 Ydensity 300 Xthumbnail 0 Ythumbnail 0 // FF,D8,FF,E0,00,10,4A,46,49,46,00,01,02,01,01,2C,01,2C,00,00 return 0; }