///////////////////////////////////////////////////////////////////////////// // Creation 30/12/2003 // // // JPG2BMP.C // --------- // // // Sylvain MARECHAL - sylvain.marechal1@libertysurf.fr ///////////////////////////////////////////////////////////////////////////// // // Convert a jpg to a bmp file // look at jpeg-6b/djpeg.c for more details // ///////////////////////////////////////////////////////////////////////////// #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ #include "jversion.h" /* for version message */ #include /* to declare isprint() */ #ifdef USE_CCOMMAND /* command-line reader for Macintosh */ #ifdef __MWERKS__ #include /* Metrowerks needs this */ #include /* ... and this */ #endif #ifdef THINK_C #include /* Think declares it here */ #endif #endif #include "jpg2bmp.h" /* for version message */ /* Create the add-on message string table. */ /* #define JMESSAGE(code,string) string , static const char * const cdjpeg_message_table[] = { #include "cderror.h" NULL }; */ //#define MAIN #ifdef MAIN // The test program int main( int argc, char * argv[] ) { if( argc != 3 ) { printf( "Usage : %s \n" ); return 1; } return Jpg2Bmp( argv[1], argv[2] ); } #endif int Jpg2Bmp( char * pszJpgFile, char * pszBmpFile ) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; djpeg_dest_ptr dest_mgr = NULL; FILE * input_file; FILE * output_file; JDIMENSION num_scanlines; /* Initialize the JPEG decompression object with default error handling. */ cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); /* Add some application-specific error messages (from cderror.h) */ // jerr.addon_message_table = cdjpeg_message_table; jerr.first_addon_message = JMSG_FIRSTADDONCODE; jerr.last_addon_message = JMSG_LASTADDONCODE; /* Open the input file. */ if ((input_file = fopen(pszJpgFile, READ_BINARY)) == NULL) { return -1; } /* Open the output file. */ if ((output_file = fopen(pszBmpFile, WRITE_BINARY)) == NULL) { return -1; } /* Specify data source for decompression */ jpeg_stdio_src(&cinfo, input_file); /* Read file header, set default decompression parameters */ (void) jpeg_read_header(&cinfo, TRUE); /* Adjust default decompression parameters by re-parsing the options */ //file_index = parse_switches(&cinfo, argc, argv, 0, TRUE); /* Initialize the output module now to let it override any crucial * option settings (for instance, GIF wants to force color quantization). */ dest_mgr = jinit_write_bmp(&cinfo, FALSE); dest_mgr->output_file = output_file; /* Start decompressor */ (void) jpeg_start_decompress(&cinfo); /* Write output file header */ (*dest_mgr->start_output) (&cinfo, dest_mgr); /* Process data */ while (cinfo.output_scanline < cinfo.output_height) { num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer, dest_mgr->buffer_height); (*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines); } /* Finish decompression and release memory. * I must do it in this order because output module has allocated memory * of lifespan JPOOL_IMAGE; it needs to finish before releasing memory. */ (*dest_mgr->finish_output) (&cinfo, dest_mgr); (void) jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); /* Close files, if we opened them */ fclose(input_file); fclose(output_file); /* All done. */ return jerr.num_warnings ? -1 : 0; }