diff options
author | Pedro Vicente Nunes <pvn@hdfgroup.org> | 2008-06-28 21:06:35 (GMT) |
---|---|---|
committer | Pedro Vicente Nunes <pvn@hdfgroup.org> | 2008-06-28 21:06:35 (GMT) |
commit | cb7a01f5ce8a788069d4db6a436b727a0f7015c0 (patch) | |
tree | 1c5c9fd44e4ef39b263f76c65dd9be9b19a30124 /tools/h52jpeg/h52jpeg.c | |
parent | e31678c3a2407951de3bca57578a5347abd45cbd (diff) | |
download | hdf5-cb7a01f5ce8a788069d4db6a436b727a0f7015c0.zip hdf5-cb7a01f5ce8a788069d4db6a436b727a0f7015c0.tar.gz hdf5-cb7a01f5ce8a788069d4db6a436b727a0f7015c0.tar.bz2 |
[svn-r15292] moved h52jpeg to /hl/tools/h52jpeg
tested: linux
Diffstat (limited to 'tools/h52jpeg/h52jpeg.c')
-rw-r--r-- | tools/h52jpeg/h52jpeg.c | 695 |
1 files changed, 0 insertions, 695 deletions
diff --git a/tools/h52jpeg/h52jpeg.c b/tools/h52jpeg/h52jpeg.c deleted file mode 100644 index 05a3e80..0000000 --- a/tools/h52jpeg/h52jpeg.c +++ /dev/null @@ -1,695 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* From jpeg documentation - * - * Include file for users of JPEG library. - * You will need to have included system headers that define at least - * the typedefs FILE and size_t before you can include jpeglib.h. - * (stdio.h is sufficient on ANSI-conforming systems.) - * You may also wish to include "jerror.h". - */ - -#include <stdio.h> -#include <stdlib.h> -#include <memory.h> - -#include "jpeglib.h" -#include "jerror.h" - -#include "H5private.h" -#include "h5tools.h" -#include "h5tools_utils.h" -#include "h5trav.h" -#include "H5IMpublic.h" - - -const char *progname = "h52jpeg"; -int d_status = EXIT_SUCCESS; - -/* command-line options: The user can specify short or long-named parameters */ -static const char *s_opts = "hVvi:t:"; -static struct long_options l_opts[] = { - { "help", no_arg, 'h' }, - { "version", no_arg, 'V' }, - { "verbose", no_arg, 'v' }, - { "image", require_arg, 'i' }, - { "type", require_arg, 't' }, - { NULL, 0, '\0' } -}; - - -/* a structure that contains h52jpeg options */ -typedef struct -{ - const char *file_name; - const char *template_name; - const char *image_name; - int image_type; - int verbose; -} h52jpeg_opt_t; - - -/* prototypes */ -static void usage(const char *prog); -static int h52jpeg(h52jpeg_opt_t opt); -static void make_jpeg_name( const char* template_name, const char* image_name, char* jpeg_name); -static int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name); -static void write_JPEG_file(char *filename, JSAMPLE *image_buffer, int image_height, int image_width, int planes); - -/*------------------------------------------------------------------------- - * Function: main - * - * Purpose: h52jpeg main program - * - * Programmer: Pedro Vicente, pvn@hdfgroup.org - * - * Date: May 30, 2008 - * - *------------------------------------------------------------------------- - */ -int main(int argc, const char *argv[]) -{ - h52jpeg_opt_t opt; - const char *image_type = NULL; - int op; - - /* initialze options to 0 */ - memset(&opt,0,sizeof(h52jpeg_opt_t)); - - /* parse command line options */ - while ((op = get_option(argc, argv, s_opts, l_opts)) != EOF) - { - switch ((char)op) - { - case 'h': - usage(progname); - exit(EXIT_SUCCESS); - case 'V': - print_version(progname); - exit(EXIT_SUCCESS); - case 'v': - opt.verbose = 1; - break; - case 'i': - opt.image_name = opt_arg; - break; - case 't': - image_type = opt_arg; - - - if ( HDstrcmp( image_type, "grey" ) == 0 ) - { - opt.image_type = 0; - } - else if ( HDstrcmp( image_type, "true" ) == 0 ) - { - opt.image_type = 1; - } - else - { - printf("<%s> is an invalid image type\n", image_type); - exit(EXIT_FAILURE); - } - - break; - - } /* switch */ - - - } /* while */ - - /* check for file names to be processed */ - if ( argv[ opt_ind ] != NULL && argv[ opt_ind + 1 ] != NULL ) - { - opt.file_name = argv[ opt_ind ]; - opt.template_name = argv[ opt_ind + 1 ]; - } - - else - { - usage(progname); - exit(EXIT_FAILURE); - } - - if ( h52jpeg(opt) < 0 ) - return 1; - - - return 0; -} - - - -/*------------------------------------------------------------------------- - * Function: usage - * - * Purpose: print usage - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static void usage(const char *prog) -{ - printf("usage: %s [OPTIONS] file template\n", prog); - printf(" file HDF5 file name\n"); - printf(" template Name template for jpeg images\n"); - printf(" OPTIONS\n"); - printf(" -h, --help Print a usage message and exit\n"); - printf(" -v, --verbose Verbose mode, print object information\n"); - printf(" -V, --version Print HDF5 version number and exit\n"); - printf(" -i, --image Image name (full path in HDF5 file)\n"); - printf(" -t T, --type=T Type of image (graycolor or truecolor)\n"); - - printf("\n"); - - printf(" T - is a string, either <grey> or <true>\n"); - -} - -/*------------------------------------------------------------------------- - * Function: h52jpeg - * - * Parameters: OPT, options at command line - * - * Purpose: traverse the HDF5 file, save HDF5 images to jpeg files, translate - * 2D datasets of classes H5T_INTEGER and H5T_FLOAT to image data and save them - * to jpeg files - * - * Return: 0, all is fine, -1 not all is fine - * - *------------------------------------------------------------------------- - */ -static int h52jpeg(h52jpeg_opt_t opt) -{ - hid_t fid; - trav_table_t *travt = NULL; - size_t i; - - - /* open the HDF5 file */ - if (( fid = h5tools_fopen(opt.file_name, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0) - { - error_msg(progname, "cannot open file <%s>\n", opt.file_name ); - return -1; - } - - /*------------------------------------------------------------------------- - * image/dataset name was specified at command line - *------------------------------------------------------------------------- - */ - - if ( opt.image_name ) - { - - /* read HDF5 image/dataset, save jpeg image */ - do_image(fid, opt, opt.image_name); - - } - - /*------------------------------------------------------------------------- - * image name was not specified; traverse the file - *------------------------------------------------------------------------- - */ - - else - - { - - /* initialize traversal table */ - trav_table_init(&travt); - - /* get the list of objects in the file */ - if ( h5trav_gettable(fid, travt) < 0 ) - goto out; - - /* search for images/datasets in file */ - for ( i = 0; i < travt->nobjs; i++) - { - - switch ( travt->objs[i].type ) - { - default: - goto out; - - case H5TRAV_TYPE_GROUP: - case H5TRAV_TYPE_NAMED_DATATYPE: - case H5TRAV_TYPE_LINK: - case H5TRAV_TYPE_UDLINK: - - break; - - case H5TRAV_TYPE_DATASET: - - /* read HDF5 image/dataset, save jpeg image */ - do_image(fid, opt, travt->objs[i].name); - - break; /* H5TRAV_TYPE_DATASET */ - - } /* switch */ - - } /* i */ - - - /* free table */ - trav_table_free(travt); - - } /* image_name */ - - - /* close */ - if ( H5Fclose(fid) < 0 ) - return -1; - - return 0; - -out: - H5E_BEGIN_TRY - { - H5Fclose(fid); - - } H5E_END_TRY; - - - return -1; -} - - - -/*------------------------------------------------------------------------- - * Function: do_image - * - * Parameters: HDF5 file id, command line options, an image name - * - * Purpose: read HDF5 image/dataset, save jpeg image - * - * Return: int - * - *------------------------------------------------------------------------- - */ -static -int do_image(hid_t fid, h52jpeg_opt_t opt, const char* image_name) -{ - hsize_t width; - hsize_t height; - hsize_t planes; - char interlace[20]; - hssize_t npals; - unsigned char* buf=NULL; - H5T_class_t tclass; - hid_t sid; - hid_t did; - hid_t tid; - int rank; - hsize_t dims[H5S_MAX_RANK]; - hsize_t maxdim[H5S_MAX_RANK]; - size_t size; - hsize_t nelmts; - const char* name; - size_t i; - int j; - int done; - char jpeg_name[1024]; - - name = image_name; - - /* build the jpeg file name */ - make_jpeg_name( opt.template_name, image_name, jpeg_name); - - done = 0; - - if ( opt.verbose) - { - printf("%s ...", name ); - } - - /*------------------------------------------------------------------------- - * HDF5 Image - *------------------------------------------------------------------------- - */ - - if ( H5IMis_image( fid, name ) ) - { - - if ( H5IMget_image_info( fid, name, &width, &height, &planes, interlace, &npals ) < 0 ) - goto out; - - if (NULL == (buf = HDmalloc( (size_t)width * (size_t)height * (size_t)planes ))) - goto out; - - if ( H5IMread_image( fid, name, buf ) < 0 ) - goto out; - - /* write the jpeg file */ - write_JPEG_file (jpeg_name, - buf, - (int) height, - (int) width, - (int) planes); - - - free( buf ); - buf = NULL; - - done = 1; - - - - } - - /*------------------------------------------------------------------------- - * HDF5 Image palette, ignore - *------------------------------------------------------------------------- - */ - - else if ( H5IMis_palette( fid, name ) ) - { - - } - - /*------------------------------------------------------------------------- - * regular dataset - *------------------------------------------------------------------------- - */ - - else - { - - unsigned char* image_buffer = NULL; - - if (( did = H5Dopen2( fid, name, H5P_DEFAULT )) < 0) - goto out; - if (( sid = H5Dget_space( did )) < 0 ) - goto out; - if (( rank = H5Sget_simple_extent_ndims(sid)) < 0 ) - goto out; - if (( tid = H5Dget_type( did )) < 0 ) - goto out; - if (( tclass = H5Tget_class(tid)) < 0) - goto out; - - if ( ( H5T_FLOAT == tclass || H5T_INTEGER == tclass) && - ( rank == 2 ) ) - { - - if ( H5Sget_simple_extent_dims( sid, dims, maxdim ) < 0 ) - goto out; - - size = H5Tget_size( tid ); - - nelmts = 1; - for ( j = 0; j < rank; j++) - { - nelmts *= dims[j]; - } - - if ( NULL == (buf = HDmalloc( (size_t)nelmts * size ))) - goto out; - if ( H5Dread(did,tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf) < 0 ) - goto out; - - height = dims[0]; - width = dims[1]; - - if ( opt.image_type == 0 ) - planes = 1; - else if ( opt.image_type == 1 ) - planes = 3; - - - if ( NULL == (image_buffer = HDmalloc( (size_t)nelmts * sizeof (unsigned char) ))) - { - goto out; - } - - /*------------------------------------------------------------------------- - * convert the data to unsigned char - * - *------------------------------------------------------------------------- - */ - - { - double min = DBL_MAX; - double max = -DBL_MAX; - double ratio; - - /* search for the minimum and maximum */ - for ( i = 0; i < nelmts; i++) - { - if ( buf[i] < min) min = buf[i]; - if ( buf[i] > max) max = buf[i]; - } - /* converts the data based on the ratio to a 0-255 range */ - ratio = (min == max) ? 1.0 : (double)(255.0/(max-min)); - for ( i = 0; i < nelmts; i++) - { - image_buffer[i] = (unsigned char)ceil( (( buf[i] - min ) / ratio) ); - } - - } - - /* write the jpeg file */ - write_JPEG_file (jpeg_name, - image_buffer, - (int) height, - (int) width, - (int) planes); - - - free( image_buffer ); - free( buf ); - buf = NULL; - image_buffer = NULL; - done = 1; - - } - - - - H5Sclose(sid); - H5Tclose(tid); - H5Dclose(did); - - - - - } /* else */ - - - if ( opt.verbose) - { - if ( done ) - { - printf("saved to %s\n", jpeg_name ); - } - else - { - printf("\n"); - } - - } - - return 0; - -out: - H5E_BEGIN_TRY - { - - H5Sclose(sid); - H5Tclose(tid); - H5Dclose(did); - - } H5E_END_TRY; - - if ( buf != NULL ) - free( buf ); - - - return -1; - -} - -/*------------------------------------------------------------------------- - * Function: make_jpeg_name - * - * Parameters: template name (IN), image name (IN), jpeg name (IN/OUT) - * - * Purpose: build a name for the jpeg image file upon a template name - * and the HDF5 image name - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static -void make_jpeg_name( const char* template_name, const char* image_name, char* jpeg_name) -{ - int j; - int len; - - HDstrcpy( jpeg_name, template_name ); - HDstrcat( jpeg_name, image_name ); - HDstrcat( jpeg_name, ".jpeg" ); - len = HDstrlen( jpeg_name); - - /* HDF5 path names might contain '/', replace with '_' */ - for (j = 0; j < len; j++) - { - if (jpeg_name[j] == '/') - { - jpeg_name[j] = '_'; - } - } - -} - - - -/* - * Sample routine for JPEG compression. - * - * 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. - */ - -static -void write_JPEG_file(char *filename, - JSAMPLE *image_buffer, /* Points to large array of R,G,B-order data */ - int image_height, /* Number of rows in image */ - int image_width, /* Number of columns in image */ - int planes) /* # of color components per pixel */ -{ - /* 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, outfile); - - /* 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 = planes; /* # of color components per pixel */ - - /* colorspace of input image */ - if (planes == 3) - cinfo.in_color_space = JCS_RGB; - else if (planes == 1) - cinfo.in_color_space = JCS_GRAYSCALE; - - /* 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, 100, 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 * planes; /* 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(outfile); - - /* 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! */ -} - |