1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#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;
}
|