| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | 
							- /****************************************************************************
 
- 	jpeg.c - read and write jpeg images using libjpeg routines
 
- 	Copyright (C) 2002 Hari Nair <hari@alumni.caltech.edu>
 
- 	This program is free software; you can redistribute it and/or modify
 
- 	it under the terms of the GNU General Public License as published by
 
- 	the Free Software Foundation; either version 2 of the License, or
 
- 	(at your option) any later version.
 
- 	This program is distributed in the hope that it will be useful,
 
- 	but WITHOUT ANY WARRANTY; without even the implied warranty of
 
- 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
- 	GNU General Public License for more details.
 
- 	You should have received a copy of the GNU General Public License
 
- 	along with this program; if not, write to the Free Software
 
- 	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
- ****************************************************************************/
 
- #include <stdio.h>
 
- #include <stdlib.h>
 
- #include <string.h>
 
- #include <jpeglib.h>
 
- #include "const.h"
 
- int
 
- read_jpeg(const char *filename, int *width, int *height, unsigned char **rgb)
 
- {
 
- 	int ret = 0;
 
- 	struct jpeg_decompress_struct cinfo;
 
- 	struct jpeg_error_mgr jerr;
 
- 	unsigned char *ptr = NULL;
 
- 	unsigned int i, ipos;
 
- 	FILE *infile = fopen(filename, "rb");
 
- 	if (infile == NULL) {
 
- 		fprintf(stderr, "Can not fopen file: %s\n",filename);
 
- 		return ret;
 
- 	}
 
- 	cinfo.err = jpeg_std_error(&jerr);
 
- 	jpeg_create_decompress(&cinfo);
 
- 	jpeg_stdio_src(&cinfo, infile);
 
- 	jpeg_read_header(&cinfo, TRUE);
 
- 	jpeg_start_decompress(&cinfo);
 
- 	/* Prevent against integer overflow */
 
- 	if(cinfo.output_width >= MAX_DIMENSION || cinfo.output_height >= MAX_DIMENSION) {
 
- 		fprintf(stderr, "Unreasonable dimension found in file: %s\n",filename);
 
- 		goto close_file;
 
- 	}
 
- 	*width = cinfo.output_width;
 
- 	*height = cinfo.output_height;
 
- 	rgb[0] = malloc(3 * cinfo.output_width * cinfo.output_height);
 
- 	if (rgb[0] == NULL) {
 
- 		fprintf(stderr, "Can't allocate memory for JPEG file.\n");
 
- 		goto close_file;
 
- 	}
 
- 	if (cinfo.output_components == 3) {
 
- 		ptr = rgb[0];
 
- 		while (cinfo.output_scanline < cinfo.output_height) {
 
- 			jpeg_read_scanlines(&cinfo, &ptr, 1);
 
- 			ptr += 3 * cinfo.output_width;
 
- 		}
 
- 	} else if (cinfo.output_components == 1) {
 
- 		ptr = malloc(cinfo.output_width);
 
- 		if (ptr == NULL) {
 
- 			fprintf(stderr, "Can't allocate memory for JPEG file.\n");
 
- 			goto rgb_free;
 
- 		}
 
- 		ipos = 0;
 
- 		while (cinfo.output_scanline < cinfo.output_height) {
 
- 			jpeg_read_scanlines(&cinfo, &ptr, 1);
 
- 			for (i = 0; i < cinfo.output_width; i++) {
 
- 				memset(rgb[0] + ipos, ptr[i], 3);
 
- 				ipos += 3;
 
- 			}
 
- 		}
 
- 		free(ptr);
 
- 	}
 
- 	jpeg_finish_decompress(&cinfo);
 
- 	ret = 1;
 
- 	goto close_file;
 
- rgb_free:
 
- 	free(rgb[0]);
 
- close_file:
 
- 	jpeg_destroy_decompress(&cinfo);
 
- 	fclose(infile);
 
- 	return(ret);
 
- }
 
 
  |