From: jpr Date: Fri, 17 Sep 2004 08:54:25 +0000 (+0000) Subject: inclusion of code for jpeg compression X-Git-Tag: Version0.6.bp~198 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=defee71df6c5b52abd43d8ba09bd1db8bed1454a;p=gdcm.git inclusion of code for jpeg compression (user intended methods not yet commited) --- diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt index 13f23bc3..4a973db9 100644 --- a/Testing/CMakeLists.txt +++ b/Testing/CMakeLists.txt @@ -32,7 +32,7 @@ IF (GDCM_DATA_ROOT) ${GDCM_SOURCE_DIR}/vtk/ ) SET(TEST_SOURCES ${TEST_SOURCES} - ShowDicom.cxx + #ShowDicom.cxx ) ENDIF(GDCM_VTK) ENDIF (GDCM_DATA_ROOT) diff --git a/src/gdcmDocEntry.cxx b/src/gdcmDocEntry.cxx index 5f313486..ed0a9e8b 100644 --- a/src/gdcmDocEntry.cxx +++ b/src/gdcmDocEntry.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocEntry.cxx,v $ Language: C++ - Date: $Date: 2004/09/13 12:10:53 $ - Version: $Revision: 1.19 $ + Date: $Date: 2004/09/17 08:54:26 $ + Version: $Revision: 1.20 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -69,7 +69,7 @@ void gdcmDocEntry::Print(std::ostream & os) if (PrintLevel >= 2) { - s << "lg : "; + s << " lg : "; lgth = GetReadLength(); // ReadLength, as opposed to UsableLength if (lgth == 0xffffffff) { diff --git a/src/gdcmFile.h b/src/gdcmFile.h index 90ea66af..667bb2d5 100644 --- a/src/gdcmFile.h +++ b/src/gdcmFile.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFile.h,v $ Language: C++ - Date: $Date: 2004/09/13 07:49:36 $ - Version: $Revision: 1.47 $ + Date: $Date: 2004/09/17 08:54:26 $ + Version: $Revision: 1.48 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -99,18 +99,27 @@ private: // For JPEG 8 Bits, body in file gdcmJpeg.cxx bool gdcm_read_JPEG_file (FILE *fp, void * image_buffer); - static int gdcm_read_RLE_fragment(char **areaToRead, long lengthToDecode, - long uncompressedSegmentSize, FILE *fp); + bool gdcm_write_JPEG_file (FILE *fp, void * image_buffer, + int image_width, int image_heigh, + int quality); // For JPEG 12 Bits, body in file gdcmJpeg12.cxx bool gdcm_read_JPEG_file12 (FILE *fp, void* image_buffer); + bool gdcm_write_JPEG_file12 (FILE *fp, void* image_buffer, + int image_width, int image_height, + int quality); // For JPEG 2000, body in file gdcmJpeg2000.cxx bool gdcm_read_JPEG2000_file (FILE *fp, void* image_buffer); // For Run Length Encoding - bool gdcm_read_RLE_file (FILE *fp, void* image_buffer); - + bool gdcm_read_RLE_file (FILE *fp, void* image_buffer); +// FIXME : *sure* it's NOT static (C++) +// (would be static in C, or embedded in ADA) +// It's NOT a method, but a not user intended fonction. +// How do we write that in C++ ?) + static int gdcm_read_RLE_fragment(char **areaToRead, long lengthToDecode, + long uncompressedSegmentSize, FILE *fp); // members variables: /// \brief Header to use to load the file diff --git a/src/gdcmJpeg.cxx b/src/gdcmJpeg.cxx index 4c8f8503..a2c3250c 100644 --- a/src/gdcmJpeg.cxx +++ b/src/gdcmJpeg.cxx @@ -81,6 +81,202 @@ extern "C" { #include } + +/******************** JPEG COMPRESSION SAMPLE INTERFACE *******************/ + +/* This half of the example shows how to feed data into the JPEG compressor. + * We present a minimal version that does not worry about refinements such + * as error recovery (the JPEG code will just exit() if it gets an error). + */ + +/* + * IMAGE DATA FORMATS: + * + * The standard input image format is a rectangular array of pixels, with + * each pixel having the same number of "component" values (color channels). + * Each pixel row is an array of JSAMPLEs (which typically are unsigned chars). + * If you are working with color data, then the color values for each pixel + * must be adjacent in the row; for example, R,G,B,R,G,B,R,G,B,... for 24-bit + * RGB color. + * + * For this example, we'll assume that this data structure matches the way + * our application has stored the image in memory, so we can just pass a + * pointer to our image buffer. In particular, let's say that the image is + * RGB color and is described by: + */ + +// FIXME : JPR + +//extern JSAMPLE * image_buffer; /* Points to large array of R,G,B-order data */ +//extern int image_height; /* Number of rows in image */ +//extern int image_width; /* Number of columns in image */ + + + +/* + * Sample routine for JPEG compression. We assume that the target file name + * and a compression quality factor are passed in. + */ + + /** + * \ingroup gdcmFile + * \brief routine for JPEG decompression + * @param fp pointer to an already open file descriptor + * 8 significant bits per pixel + * @param image_buffer Points to array (of R,G,B-order) data to compress + * @param quality compression quality + * @param image_height Number of rows in image + * @param image_width Number of columns in image + * @return 1 on success, 0 on error + */ + +bool gdcm_write_JPEG_file (FILE *fp, void * im_buf, + int image_width, int image_height, int quality) +{ + + JSAMPLE* image_buffer = (JSAMPLE*) im_buf; + + /* This struct contains the JPEG compression parameters and pointers to + * working space (which is allocated as needed by the JPEG library). + * It is possible to have several such structures, representing multiple + * compression/decompression processes, in existence at once. We refer + * to any one struct (and its associated working data) as a "JPEG object". + */ + struct jpeg_compress_struct cinfo; + /* This struct represents a JPEG error handler. It is declared separately + * because applications often want to supply a specialized error handler + * (see the second half of this file for an example). But here we just + * take the easy way out and use the standard error handler, which will + * print a message on stderr and call exit() if compression fails. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + struct jpeg_error_mgr jerr; + /* More stuff */ + //FILE * outfile; /* target file */ + JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ + int row_stride; /* physical row width in image buffer */ + + /* Step 1: allocate and initialize JPEG compression object */ + + /* We have to set up the error handler first, in case the initialization + * step fails. (Unlikely, but it could happen if you are out of memory.) + * This routine fills in the contents of struct jerr, and returns jerr's + * address which we place into the link field in cinfo. + */ + cinfo.err = jpeg_std_error(&jerr); + /* Now we can initialize the JPEG compression object. */ + jpeg_create_compress(&cinfo); + + /* Step 2: specify data destination (eg, a file) */ + /* Note: steps 2 and 3 can be done in either order. */ + + /* Here we use the library-supplied code to send compressed data to a + * stdio stream. You can also write your own code to do something else. + * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that + * requires it in order to write binary files. + */ + // if ((outfile = fopen(filename, "wb")) == NULL) { + // fprintf(stderr, "can't open %s\n", filename); + // exit(1); + // + // } + jpeg_stdio_dest(&cinfo, fp); + + /* Step 3: set parameters for compression */ + + /* First we supply a description of the input image. + * Four fields of the cinfo struct must be filled in: + */ + cinfo.image_width = image_width;/* image width and height, in pixels */ + cinfo.image_height = image_height; + cinfo.input_components = 3; /* # of color components per pixel */ + cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ + /* Now use the library's routine to set default compression parameters. + * (You must set at least cinfo.in_color_space before calling this, + * since the defaults depend on the source color space.) + */ + jpeg_set_defaults(&cinfo); + /* Now you can set any non-default parameters you wish to. + * Here we just illustrate the use of quality (quantization table) scaling: + */ + jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */); + + /* Step 4: Start compressor */ + + /* TRUE ensures that we will write a complete interchange-JPEG file. + * Pass TRUE unless you are very sure of what you're doing. + */ + jpeg_start_compress(&cinfo, TRUE); + + /* Step 5: while (scan lines remain to be written) */ + /* jpeg_write_scanlines(...); */ + + /* Here we use the library's state variable cinfo.next_scanline as the + * loop counter, so that we don't have to keep track ourselves. + * To keep things simple, we pass one scanline per call; you can pass + * more if you wish, though. + */ + row_stride = image_width * 3;/* JSAMPLEs per row in image_buffer */ + + while (cinfo.next_scanline < cinfo.image_height) { + /* jpeg_write_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could pass + * more than one scanline at a time if that's more convenient. + */ + row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; + + (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + + /* Step 6: Finish compression */ + + jpeg_finish_compress(&cinfo); + + /* After finish_compress, we can close the output file. */ + + // fclose(fp); --> the caller will close (multiframe treatement) + + /* Step 7: release JPEG compression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_compress(&cinfo); + + /* And we're done! */ +} + + + +/* + * SOME FINE POINTS: + * + * In the above loop, we ignored the return value of jpeg_write_scanlines, + * which is the number of scanlines actually written. We could get away + * with this because we were only relying on the value of cinfo.next_scanline, + * which will be incremented correctly. If you maintain additional loop + * variables then you should be careful to increment them properly. + * Actually, for output to a stdio stream you needn't worry, because + * then jpeg_write_scanlines will write all the lines passed (or else exit + * with a fatal error). Partial writes can only occur if you use a data + * destination module that can demand suspension of the compressor. + * (If you don't know what that's for, you don't need it.) + * + * If the compressor requires full-image buffers (for entropy-coding + * optimization or a multi-scan JPEG file), it will create temporary + * files for anything that doesn't fit within the maximum-memory setting. + * (Note that temp files are NOT needed if you use the default parameters.) + * On some systems you may need to set up a signal handler to ensure that + * temporary files are deleted if the program is interrupted. See libjpeg.doc. + * + * Scanlines MUST be supplied in top-to-bottom order if you want your JPEG + * files to be compatible with everyone else's. If you cannot readily read + * your data in that order, you'll need an intermediate array to hold the + * image. See rdtarga.c or rdbmp.c for examples of handling bottom-to-top + * source data using the JPEG code's internal virtual-array mechanisms. + */ + + + /******************** JPEG DECOMPRESSION SAMPLE INTERFACE *******************/ /* This half of the example shows how to read data from the JPEG decompressor. @@ -194,7 +390,7 @@ bool gdcmFile::gdcm_read_JPEG_file (FILE *fp,void * image_buffer) { int row_stride;/* physical row width in output buffer */ #ifdef GDCM_JPG_DEBUG - printf("entree dans gdcmFile::gdcm_read_JPEG_file12, depuis gdcmJpeg\n"); + printf("entree dans gdcmFile::gdcm_read_JPEG_file (i.e. 8), depuis gdcmJpeg\n"); #endif //GDCM_JPG_DEBUG /* In this example we want to open the input file before doing anything else, @@ -375,6 +571,7 @@ bool gdcmFile::gdcm_read_JPEG_file (FILE *fp,void * image_buffer) { return(true); } + /* * SOME FINE POINTS: * diff --git a/src/gdcmJpeg12.cxx b/src/gdcmJpeg12.cxx index 97d7a77a..956cda50 100644 --- a/src/gdcmJpeg12.cxx +++ b/src/gdcmJpeg12.cxx @@ -92,6 +92,16 @@ extern "C" { #include "jpeg/libijg12/jpeglib12.h" #include } +/******************** JPEG COMPRESSION SAMPLE INTERFACE *******************/ + +// +// TODO +// + +bool gdcm_write_JPEG_file12 (FILE *fp, void * im_buff, + int image_width, int image_heigh, int quality) +{ +} /******************** JPEG DECOMPRESSION SAMPLE INTERFACE *******************/ diff --git a/src/jpeg/libijg/CMakeLists.txt b/src/jpeg/libijg/CMakeLists.txt index 421db102..f327e653 100644 --- a/src/jpeg/libijg/CMakeLists.txt +++ b/src/jpeg/libijg/CMakeLists.txt @@ -5,68 +5,68 @@ ##CXXFLAGS = @CXXFLAGS@ SET(libgdcmijpeg8_la_SOURCES -# jcapimin.c -# jcapistd.c -# jctrans.c -# jcparam.c -# jdatadst.c -# jcinit.c -# jcmaster.c -# jcmarker.c -# jcmainct.c -# jcprepct.c -# jccoefct.c -# jccolor.c -# jcsample.c -# jchuff.c -# jcphuff.c -# jcdctmgr.c - jfdctfst.c - jfdctflt.c - jfdctint.c - jdapimin.c - jdapistd.c - jdtrans.c - jdatasrc.c - jdmaster.c - jdinput.c - jdmarker.c - jdhuff.c - jdphuff.c - jdmainct.c - jdcoefct.c - jdpostct.c - jddctmgr.c - jidctfst.c - jidctflt.c - jidctint.c - jidctred.c - jdsample.c - jdcolor.c - jquant1.c - jquant2.c - jdmerge.c - jcomapi.c - jutils.c - jerror.c - jmemmgr.c - jmemnobs.c - rdrle.c +jcapimin.c +jcapistd.c +jctrans.c +jcparam.c +jdatadst.c +jcinit.c +jcmaster.c +jcmarker.c +jcmainct.c +jcprepct.c +jccoefct.c +jccolor.c +jcsample.c +jchuff.c +jcphuff.c +jcdctmgr.c # where commented out till here +jfdctfst.c +jfdctflt.c +jfdctint.c +jdapimin.c +jdapistd.c +jdtrans.c +jdatasrc.c +jdmaster.c +jdinput.c +jdmarker.c +jdhuff.c +jdphuff.c +jdmainct.c +jdcoefct.c +jdpostct.c +jddctmgr.c +jidctfst.c +jidctflt.c +jidctint.c +jidctred.c +jdsample.c +jdcolor.c +jquant1.c +jquant2.c +jdmerge.c +jcomapi.c +jutils.c +jerror.c +jmemmgr.c +jmemnobs.c +# rdrle.c ) #libgdcmijpeg8includedir = $(includedir) SET(libgdcmijpeg8include_HEADERS - jchuff.h - jconfig.h - jdct.h - jdhuff.h - jerror.h - jinclude.h - jmemsys.h - jmorecfg.h - jpegint.h - jpeglib.h - jversion.h +jchuff.h +jconfig.h +jdct.h +jdhuff.h +jerror.h +jinclude.h +jmemsys.h +jmorecfg.h +jpegint.h +jpeglib.h +jversion.h ) #EXTRA_DIST = \ diff --git a/src/jpeg/libijg8/CMakeLists.txt b/src/jpeg/libijg8/CMakeLists.txt index 421db102..f327e653 100644 --- a/src/jpeg/libijg8/CMakeLists.txt +++ b/src/jpeg/libijg8/CMakeLists.txt @@ -5,68 +5,68 @@ ##CXXFLAGS = @CXXFLAGS@ SET(libgdcmijpeg8_la_SOURCES -# jcapimin.c -# jcapistd.c -# jctrans.c -# jcparam.c -# jdatadst.c -# jcinit.c -# jcmaster.c -# jcmarker.c -# jcmainct.c -# jcprepct.c -# jccoefct.c -# jccolor.c -# jcsample.c -# jchuff.c -# jcphuff.c -# jcdctmgr.c - jfdctfst.c - jfdctflt.c - jfdctint.c - jdapimin.c - jdapistd.c - jdtrans.c - jdatasrc.c - jdmaster.c - jdinput.c - jdmarker.c - jdhuff.c - jdphuff.c - jdmainct.c - jdcoefct.c - jdpostct.c - jddctmgr.c - jidctfst.c - jidctflt.c - jidctint.c - jidctred.c - jdsample.c - jdcolor.c - jquant1.c - jquant2.c - jdmerge.c - jcomapi.c - jutils.c - jerror.c - jmemmgr.c - jmemnobs.c - rdrle.c +jcapimin.c +jcapistd.c +jctrans.c +jcparam.c +jdatadst.c +jcinit.c +jcmaster.c +jcmarker.c +jcmainct.c +jcprepct.c +jccoefct.c +jccolor.c +jcsample.c +jchuff.c +jcphuff.c +jcdctmgr.c # where commented out till here +jfdctfst.c +jfdctflt.c +jfdctint.c +jdapimin.c +jdapistd.c +jdtrans.c +jdatasrc.c +jdmaster.c +jdinput.c +jdmarker.c +jdhuff.c +jdphuff.c +jdmainct.c +jdcoefct.c +jdpostct.c +jddctmgr.c +jidctfst.c +jidctflt.c +jidctint.c +jidctred.c +jdsample.c +jdcolor.c +jquant1.c +jquant2.c +jdmerge.c +jcomapi.c +jutils.c +jerror.c +jmemmgr.c +jmemnobs.c +# rdrle.c ) #libgdcmijpeg8includedir = $(includedir) SET(libgdcmijpeg8include_HEADERS - jchuff.h - jconfig.h - jdct.h - jdhuff.h - jerror.h - jinclude.h - jmemsys.h - jmorecfg.h - jpegint.h - jpeglib.h - jversion.h +jchuff.h +jconfig.h +jdct.h +jdhuff.h +jerror.h +jinclude.h +jmemsys.h +jmorecfg.h +jpegint.h +jpeglib.h +jversion.h ) #EXTRA_DIST = \ diff --git a/vtk/vtkGdcmReader.cxx b/vtk/vtkGdcmReader.cxx index 97d0115c..fdbb9c85 100644 --- a/vtk/vtkGdcmReader.cxx +++ b/vtk/vtkGdcmReader.cxx @@ -1,7 +1,7 @@ // vtkGdcmReader.cxx //----------------------------------------------------------------------------- // ////////////////////////////////////////////////////////////// -// WARNING TODO CLENAME +// WARNING TODO CLEANME // Actual limitations of this code: // // /////// Redundant and unnecessary header parsing @@ -58,7 +58,7 @@ #include #include -vtkCxxRevisionMacro(vtkGdcmReader, "$Revision: 1.49 $"); +vtkCxxRevisionMacro(vtkGdcmReader, "$Revision: 1.50 $"); vtkStandardNewMacro(vtkGdcmReader); //-----------------------------------------------------------------------------