#include #include #include #include int main(int argc, char* argv[]) { /***************************/ /* Variable initialization */ /***************************/ FILE *ifp,*ofp; /* eWav information */ u_int16_t *Amplitude; typedef struct eWavHead { u_int64_t Channels; /* number of channels stored in file */ u_int64_t WFD_Offset; /* Offset in bytes from beginning of file to first eWav File Directory */ } eWavHead; /* 16 bytes */ typedef struct ChannelHeader { float ResX; /* Image resolution in dots/cm */ float RexY; /* Image resolution in dots/cm */ double Scale_mm_sec; double Scale_mv_cm; u_int32_t Samples; } ChannelHeader; eWavHead FileHeader; ChannelHeader ch; u_int16_t max,min; /* image information */ int image_width,image_height, x, y, row, image_float; int bottom, top, last, i, j; float xpixline,ypixline,xstep,ystep; /* png information */ png_structp write_ptr; png_infop write_info_ptr; unsigned char **row_pointers, invisigrey, linegrey, background, signalblack; /*********************/ /* Read in eWav file */ /*********************/ ifp = fopen(argv[1], "rb"); fread(&FileHeader,sizeof(eWavHead),1,ifp); fread(&ch,sizeof(ChannelHeader),1,ifp); printf("Channels:%d, Offset:%d\n",(int)FileHeader.Channels,(int)FileHeader.WFD_Offset); printf("X resolution: %f, Y resolution: %f, cm/sec: %f, Millivolts/cm: %f, Samples:%d\n", ch.ResX,ch.RexY,ch.Scale_mm_sec/10,ch.Scale_mv_cm,(int)ch.Samples); Amplitude=(u_int16_t *)calloc(ch.Samples,sizeof(u_int16_t)); fread(Amplitude,sizeof(u_int16_t),ch.Samples,ifp); fclose(ifp); /*******************************/ /* Find max and min amplitudes */ /*******************************/ max=min=Amplitude[0]; for(i=0;imax) max=Amplitude[i]; if (Amplitude[i]top) top=last-Amplitude[x]+1; // printf("Last=%d, current=%d, Bottom=%d, Top=%d\n",last,Amplitude[x],bottom,top); last=Amplitude[x]; for (y=bottom;y<=top;y++) for (j=-1;j<=1;j++) row_pointers[(image_height-(Amplitude[x]-min+image_float+y))][x+j]=signalblack; } /*******************/ /* Write PNG image */ /*******************/ /* Open output file */ ofp = fopen(argv[2], "wb"); if (!ofp) return(1); /* 1 = couldn't open output file */ printf("Opened output file.\n"); /* Initialize image variables */ write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL, (png_error_ptr)NULL, (png_error_ptr)NULL); if (!write_ptr) return(2); /* 2 = couldn't allocate write structure */ printf("Allocated write structure.\n"); write_info_ptr = png_create_info_struct(write_ptr); if (!write_info_ptr) { png_destroy_write_struct(&write_ptr,(png_infopp)NULL); return(3); /* 3 = couldn't allocate info structure */ } printf("Allocated Info structure.\n"); if (setjmp(write_ptr->jmpbuf)) { png_destroy_write_struct(&write_ptr, &write_info_ptr); fclose(ofp); return(4); /* 4 = libpng write error */ } printf("Tested longjmp\n"); png_init_io(write_ptr, ofp); printf("Initialized output pointer.\n"); /* Define information about image */ png_set_IHDR(write_ptr, write_info_ptr, image_width, image_height, 8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); printf("Defined info about image.\n"); /* Write info up to image data */ png_write_info(write_ptr, write_info_ptr); printf("Wrote preliminary image data.\n"); png_write_image(write_ptr, row_pointers); png_write_end(write_ptr, write_info_ptr); printf("Called end to data.\n"); /* Tidy up */ png_destroy_write_struct(&write_ptr, &write_info_ptr); printf("Destroyed write structure.\n"); exit(0); }