#include "cips.h" struct bmpfileheader{ unsigned short filetype; unsigned long filesize; short reserved1; short reserved2; unsigned long bitmapoffset; }; struct bitmapheader{ unsigned long size; long width; long height; unsigned short planes; unsigned short bitsperpixel; unsigned long compression; unsigned long sizeofbitmap; unsigned long horzres; unsigned long vertres; unsigned long colorsused; unsigned long colorsimp; }; struct ctstruct{ unsigned char blue; unsigned char green; unsigned char red; }; main(argc, argv) int argc; char *argv[]; { struct bmpfileheader file_header; struct bitmapheader bmheader; struct ctstruct rgb[256]; FILE *fp; short **the_image; int i, j; long height = 0, width = 0; int negative = 0; /****************************************** * * ******************************************/ if(argc < 2){ printf("\ntestbmp file-name.bmp"); exit(0); } read_bmp_file_header(argv[1], &file_header); print_bmp_file_header(&file_header); read_bm_header(argv[1], &bmheader); print_bm_header(&bmheader); width = bmheader.width; if(bmheader.height < 0) height = bmheader.height * (-1); else height = bmheader.height; the_image = allocate_image_array(height, width); read_bmp_image(argv[1], the_image); for(i=0; i<15; i++){ printf("\n"); for(j=0; j<15; j++){ printf("-%3d", the_image[i][j]); } } free_image_array(the_image, height); #ifdef TESTWRITE read_bm_header(argv[1], &bmheader); width = bmheader.width; if(bmheader.height < 0) height = bmheader.height * (-1); else height = bmheader.height; the_image = allocate_image_array(height, width); for(i=0; ifiletype = uss; fread(buffer, 1, 4, fp); extract_ulong_from_buffer(buffer, 1, 0, &ull); file_header->filesize = ull; fread(buffer, 1, 2, fp); extract_short_from_buffer(buffer, 1, 0, &ss); file_header->reserved1 = ss; fread(buffer, 1, 2, fp); extract_short_from_buffer(buffer, 1, 0, &ss); file_header->reserved2 = ss; fread(buffer, 1, 4, fp); extract_ulong_from_buffer(buffer, 1, 0, &ull); file_header->bitmapoffset = ull; fclose(fp); } /* ends read_bmp_file_header */ print_bmp_file_header(struct bmpfileheader *file_header) { printf("\nfile type %x", file_header->filetype); printf("\nfile size %d", file_header->filesize); printf("\nbit map offset %d", file_header->bitmapoffset); } read_bm_header(file_name, bmheader) char *file_name; struct bitmapheader *bmheader; { char buffer[10]; long ll; short ss; unsigned long ull; unsigned short uss; FILE *fp; fp = fopen(file_name, "rb"); /**************************************** * * Seek past the first 14 byte header. * ****************************************/ fseek(fp, 14, SEEK_SET); fread(buffer, 1, 4, fp); extract_ulong_from_buffer(buffer, 1, 0, &ull); bmheader->size = ull; fread(buffer, 1, 4, fp); extract_long_from_buffer(buffer, 1, 0, &ll); bmheader->width = ll; fread(buffer, 1, 4, fp); extract_long_from_buffer(buffer, 1, 0, &ll); bmheader->height = ll; fread(buffer, 1, 2, fp); extract_ushort_from_buffer(buffer, 1, 0, &uss); bmheader->planes = uss; fread(buffer, 1, 2, fp); extract_ushort_from_buffer(buffer, 1, 0, &uss); bmheader->bitsperpixel = uss; fread(buffer, 1, 4, fp); extract_ulong_from_buffer(buffer, 1, 0, &ull); bmheader->compression = ull; fread(buffer, 1, 4, fp); extract_ulong_from_buffer(buffer, 1, 0, &ull); bmheader->sizeofbitmap = ull; fread(buffer, 1, 4, fp); extract_ulong_from_buffer(buffer, 1, 0, &ull); bmheader->horzres = ull; fread(buffer, 1, 4, fp); extract_ulong_from_buffer(buffer, 1, 0, &ull); bmheader->vertres = ull; fread(buffer, 1, 4, fp); extract_ulong_from_buffer(buffer, 1, 0, &ull); bmheader->colorsused = ull; fread(buffer, 1, 4, fp); extract_ulong_from_buffer(buffer, 1, 0, &ull); bmheader->colorsimp = ull; fclose(fp); } /* ends read_bm_header */ print_bm_header(struct bitmapheader *bmheader) { printf("\nwidth %d", bmheader->width); printf("\nheight %d", bmheader->height); printf("\nplanes %d", bmheader->planes); printf("\nbitsperpixel %d", bmheader->bitsperpixel); printf("\ncolorsused %d", bmheader->colorsused); printf("\ncolorsimp %d", bmheader->colorsimp); } read_color_table(file_name, rgb, size) char *file_name; struct ctstruct *rgb; int size; { int i; char buffer[10]; FILE *fp; fp = fopen(file_name, "rb"); fseek(fp, 54, SEEK_SET); for(i=0; iwidth); bmheader->size = 40; bmheader->planes = 1; bmheader->bitsperpixel = 8; bmheader->compression = 0; bmheader->sizeofbitmap = bmheader->height * (bmheader->width + pad); bmheader->horzres = 300; bmheader->vertres = 300; bmheader->colorsused = 256; bmheader->colorsimp = 256; file_header->filetype = 0x4D42; file_header->reserved1 = 0; file_header->reserved2 = 0; file_header->bitmapoffset = 14 + bmheader->size + bmheader->colorsused*4; file_header->filesize = file_header->bitmapoffset + bmheader->sizeofbitmap; if((fp = fopen(file_name, "wb")) == NULL){ printf("\nERROR Could not create file %s", file_name); exit(2); } /********************************************* * * Write the 14-byte bmp file header. * *********************************************/ insert_ushort_into_buffer(buffer, 0, file_header->filetype); fwrite(buffer, 1, 2, fp); insert_ulong_into_buffer(buffer, 0, file_header->filesize); fwrite(buffer, 1, 4, fp); insert_short_into_buffer(buffer, 0, file_header->reserved1); fwrite(buffer, 1, 2, fp); insert_short_into_buffer(buffer, 0, file_header->reserved2); fwrite(buffer, 1, 2, fp); insert_ulong_into_buffer(buffer, 0, file_header->bitmapoffset); fwrite(buffer, 1, 4, fp); /********************************************* * * Write the 40-byte bit map header. * *********************************************/ insert_ulong_into_buffer(buffer, 0, bmheader->size); fwrite(buffer, 1, 4, fp); insert_long_into_buffer(buffer, 0, bmheader->width); fwrite(buffer, 1, 4, fp); insert_long_into_buffer(buffer, 0, bmheader->height); fwrite(buffer, 1, 4, fp); insert_ushort_into_buffer(buffer, 0, bmheader->planes); fwrite(buffer, 1, 2, fp); insert_ushort_into_buffer(buffer, 0, bmheader->bitsperpixel); fwrite(buffer, 1, 2, fp); insert_ulong_into_buffer(buffer, 0, bmheader->compression); fwrite(buffer, 1, 4, fp); insert_ulong_into_buffer(buffer, 0, bmheader->sizeofbitmap); fwrite(buffer, 1, 4, fp); insert_ulong_into_buffer(buffer, 0, bmheader->horzres); fwrite(buffer, 1, 4, fp); insert_ulong_into_buffer(buffer, 0, bmheader->vertres); fwrite(buffer, 1, 4, fp); insert_ulong_into_buffer(buffer, 0, bmheader->colorsused); fwrite(buffer, 1, 4, fp); insert_ulong_into_buffer(buffer, 0, bmheader->colorsimp); fwrite(buffer, 1, 4, fp); /********************************************* * * Write a blank color table. * It has 256 entries (number of colors) * that are each 4 bytes. * *********************************************/ buffer[0] = 0x00; for(i=0; i<(256*4); i++) fwrite(buffer, 1, 1, fp); /********************************************* * * Write a zero image. * *********************************************/ buffer[0] = 0x00; for(i=0; isizeofbitmap; i++) fwrite(buffer, 1, 1, fp); fclose(fp); } /* ends create_allocate_bmp_file */ create_bmp_file_if_needed(in_name, out_name, out_image) char in_name[], out_name[]; short **out_image; { int length, width; struct bmpfileheader file_header; struct bitmapheader bmheader; if(does_not_exist(out_name)){ printf("\n\n output file does not exist %s", out_name); read_bm_header(in_name, &bmheader); create_allocate_bmp_file(out_name, &file_header, &bmheader); printf("\nBFIN> Created %s", out_name); } /* ends if does_not_exist */ } /* ends bcreate_file_if_needed */ write_bmp_image(file_name, array) char *file_name; short **array; { char *buffer, c; FILE *image_file; int pad = 0, position; int bytes, i, j; long height = 0, width = 0; struct bitmapheader bmheader; struct bmpfileheader file_header; struct ctstruct rgb[GRAY_LEVELS+1]; union short_char_union scu; read_bmp_file_header(file_name, &file_header); read_bm_header(file_name, &bmheader); height = bmheader.height; width = bmheader.width; if(height < 0) height = height*(-1); buffer = (char *) malloc(width * sizeof(char )); for(i=0; i 0) scu.s_num = array[height-1-i][j]; else scu.s_num = array[i][j]; buffer[j] = scu.s_alpha[0]; } /* ends if bits_per_pixel == 8 */ else{ printf("\nERROR bitsperpixel is not 8"); exit(1); } } /* ends loop over j */ bytes = fwrite(buffer, 1, width, image_file); if(pad != 0){ for(j=0; j