From 1a735f44bbb5553bb2d12cf86de4b59b1206c9dd Mon Sep 17 00:00:00 2001 From: Oliver Schinagl Date: Mon, 11 Apr 2005 21:53:07 +0000 Subject: bmp.c is for reading and writing bmp-files jpeg.c is for reading and writing jpeg-files main.c is update with the new futures of bmp.c and jpeg.c --- src/bmp.c | 64 +++++++++++++++++++++++ src/jpeg.c | 62 +++++++++++++++++++++++ src/main.c | 169 ++++++++++++++++++++++++------------------------------------- 3 files changed, 192 insertions(+), 103 deletions(-) create mode 100644 src/bmp.c create mode 100644 src/jpeg.c diff --git a/src/bmp.c b/src/bmp.c new file mode 100644 index 0000000..e8cdd87 --- /dev/null +++ b/src/bmp.c @@ -0,0 +1,64 @@ +void GetBMPHeaderInfo (unsigned char *Image,unsigned int *offset,unsigned int *x_size,unsigned int *y_size, unsigned char *depth) +{ + *offset = ((int)Image[13] << 24) + ((int)Image[12] << 16) + ((int)Image[11] << 8) + Image[10]; + *x_size = ((int)Image[21] << 24) + ((int)Image[20] << 16) + ((int)Image[19] << 8) + Image[18]; + *y_size = ((int)Image[25] << 24) + ((int)Image[24] << 16) + ((int)Image[23] << 8) + Image[22]; + *depth = ((int)Image[29] << 8) + Image[28]; +} + +void WriteBMPHeaderInfo(unsigned char *Image,unsigned int offset,unsigned int x_size,unsigned int y_size, unsigned char depth) +{ + unsigned int ByteSize, i; + ByteSize = (x_size*y_size*(depth/8)); + // 2 - signature, must be 4D42 hex + Image[0]=0x42; + Image[1]=0x4d; + // 4 - size of BMP file in bytes (unreliable) + Image[5] = (ByteSize+offset) >> 24; + Image[4] = (ByteSize+offset) >> 16; + Image[3] = (ByteSize+offset) >> 8; + Image[2] = (ByteSize+offset); + // 4 - reserved, must be zero + Image[6] = 0; + Image[7] = 0; + Image[8] = 0; + Image[9] = 0; + // 4 - offset + Image[13] = offset >> 24; + Image[12] = offset >> 16; + Image[11] = offset >> 8; + Image[10] = offset; + // 4 - size of BITMAPINFOHEADER structure, must be 40 + Image[14] = 40; + Image[15] = 0; + Image[16] = 0; + Image[17] = 0; + // 4 - x_size + Image[21] = x_size >> 24; + Image[20] = x_size >> 16; + Image[19] = x_size >> 8; + Image[18] = x_size; + // 4 - y_size + Image[25] = y_size >> 24; + Image[24] = y_size >> 16; + Image[23] = y_size >> 8; + Image[22] = y_size; + // 2 - number of planes in the image, must be 1 + Image[26] = 1; + Image[27] = 0; + // 2 - depth + Image[29]= 0x0; + Image[28]= depth; + // 4 - compression type (0=none, 1=RLE-8, 2=RLE-4) + Image[30] = 0; + Image[31] = 0; + Image[32] = 0; + Image[33] = 0; + // 34 4 - size of image data in bytes (including padding) + Image[37] = ByteSize >> 24; + Image[36] = ByteSize >> 16; + Image[35] = ByteSize >> 8; + Image[34] = ByteSize; + for(i = 38; i < offset; i++) + Image[i]=0; +} diff --git a/src/jpeg.c b/src/jpeg.c new file mode 100644 index 0000000..5c779ea --- /dev/null +++ b/src/jpeg.c @@ -0,0 +1,62 @@ +#define SOI_MK 0xFFD8 /* start of image */ +#define SOF_MK 0xFFC0 /* start of frame */ +#define EOI_MK 0xFFD9 /* end of image */ +#define DRI_MK 0xFFDD /* restart interval */ + +#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; + /* 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 != SOF_MK) + { + aux = get_size(hCounter); hCounter+=2; + if(aux == SOF_MK) + { + get_size(hCounter); hCounter+=2; /* header size, don't care */ + + /* 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"); + + return 0; + } + else + hCounter = hCounter + get_size(hCounter); + } + return 1; +} + +unsigned char WriteJPEGHeaderInfo (unsigned char *Image,unsigned int offset,unsigned int x_size,unsigned int y_size, unsigned char depth) +{ + return 0; +} diff --git a/src/main.c b/src/main.c index dcf60a5..332978c 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,8 @@ #include #include "dct.h" #include "bmpjpeg.h" +#include "bmp.h" +#include "jpeg.h" #define ENCODE 0 #define DECODE 1 @@ -8,28 +10,37 @@ #define MAXCOLS 768 #define HEADER 54 -#define SOI_MK 0xFFD8 /* start of image */ -#define SOF_MK 0xFFC0 /* start of frame */ -#define EOI_MK 0xFFD9 /* end of image */ -#define DRI_MK 0xFFDD /* restart interval */ +unsigned char Image1[MAXCOLS*3*MAXROWS+HEADER]; -#define get_size(fi) (((unsigned int)Image1[fi]) << 8) + (unsigned int)Image1[fi+1] +/*------------------------------------------*/ +/* some constants for on-the-fly IQ and IZZ */ +/*------------------------------------------*/ + +static const int G_ZZ[] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63 +}; -unsigned char Image1[MAXCOLS*3*MAXROWS+HEADER]; int main(int argc, char *argv[]) { int retval, i; int workspace[DCTSIZE_BLOCK]; - unsigned char blok8x8[64*3]; - - int type, hCounter = 0; - int x_size, y_size, offset, depth; + unsigned char type; + unsigned int x_size, y_size, offset; + unsigned char depth; char *fileIn, *fileOut; + FILE *fI, *fO; - unsigned char ch, mrgb[3]; - unsigned int aux; + + /*******************************************************************************************/ /* Just for testing on the PC */ @@ -58,69 +69,47 @@ int main(int argc, char *argv[]) { /* The image must be in the memory by now */ +// retval = 0; + switch(type) { - case ENCODE: - offset = ((int)Image1[13] << 24) + ((int)Image1[12] << 16) + ((int)Image1[11] << 8) + Image1[10]; - x_size = ((int)Image1[21] << 24) + ((int)Image1[20] << 16) + ((int)Image1[19] << 8) + Image1[18]; - y_size = ((int)Image1[25] << 24) + ((int)Image1[24] << 16) + ((int)Image1[23] << 8) + Image1[22]; - depth = ((int)Image1[29] << 8) + Image1[28]; - -/**/ printf("Image Resolution: %d x %d x %i Offset: %i\n", x_size, y_size, depth, offset); - - break; - case DECODE: - - /* 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 != SOF_MK) - { - aux = get_size(hCounter); hCounter+=2; - if(aux == SOF_MK) - { - get_size(hCounter); hCounter+=2; /* header size, don't care */ - - /* 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 = Image1[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"); - - return 0; - } - else - { - hCounter = hCounter + get_size(hCounter); - } - } -} + case ENCODE: + + GetBMPHeaderInfo (Image1,&offset,&x_size,&y_size,&depth); + printf("Image Resolution: %d x %d x %i Offset: %i\n", x_size, y_size, depth, offset); + // RGB -> YUV ---> done + + // Convert to 8x8 --> done + //BMPto8x8AndYCbCr(0,0,x_size,y_size,offset,depth,Image1,blok8x8); + // DCT + fdct(workspace); + + // ZZ + + // Q + + // VLC (huffman) + + break; + case DECODE: + + GetJPEGHeaderInfo (Image1,&offset,&x_size,&y_size,&depth); + // VLD (huffman) + + // IQ + + // ZZ + + // IDCT + //idct(workspace); + // Convert 8x8 to BMP style -> done + // YUV -> RGB + // YCbCrAnd8x8toBMP() + // WriteBMPHeaderInfo(Image1,offset,x_size,y_size, depth); + + break; + } - retval = 0; - type = ENCODE; printf("Before:"); for(i=0;i<(x_size*y_size*3);i++) { @@ -152,38 +141,12 @@ int main(int argc, char *argv[]) { } - switch(type) { - case ENCODE: - // RGB -> YUV ---> done - - // Convert to 8x8 --> done - //BMPto8x8AndYCbCr(0,0,x_size,y_size,offset,depth,Image1,blok8x8); - // DCT - fdct(workspace); - - // ZZ - - // Q - - // VLC (huffman) - - break; - case DECODE: - // VLD (huffman) - - // IQ - - // ZZ - - // IDCT - //idct(workspace); - // Convert 8x8 to BMP style -> done - // YUV -> RGB - // YCbCrAnd8x8toBMP() - - break; - } + //Write Image to the output file. + fwrite(Image1, sizeof(unsigned char), (x_size*y_size*(depth/8))+offset, fO); + fclose(fI); + fclose(fO); return retval; } + -- cgit v0.12