diff options
| author | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2006-08-02 18:21:54 +0200 | 
|---|---|---|
| committer | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2006-08-02 18:21:54 +0200 | 
| commit | 699556f7efcf6a9af39c37bd0c881ee3edc21da3 (patch) | |
| tree | 55a53b797a7f755f280cf74c19d0b61f715c1f43 | |
| parent | f2e115a29f85d8d637f2e0894532212e93691118 (diff) | |
add JPEGOutputImage.cxx
| -rw-r--r-- | src/JPEGOutputImage.H | 1 | ||||
| -rw-r--r-- | src/JPEGOutputImage.cxx | 118 | ||||
| -rw-r--r-- | src/gipfel.cxx | 4 | 
3 files changed, 120 insertions, 3 deletions
| diff --git a/src/JPEGOutputImage.H b/src/JPEGOutputImage.H index 31bdd76..50570e5 100644 --- a/src/JPEGOutputImage.H +++ b/src/JPEGOutputImage.H @@ -32,7 +32,6 @@ class JPEGOutputImage : OutputImage {  	private:  		unsigned char *row;  		char *file; -		int w, h;  		struct jpeg_compress_struct cinfo;  		struct jpeg_error_mgr jerr;  		FILE *fp; diff --git a/src/JPEGOutputImage.cxx b/src/JPEGOutputImage.cxx new file mode 100644 index 0000000..09fd4c6 --- /dev/null +++ b/src/JPEGOutputImage.cxx @@ -0,0 +1,118 @@ +//  +// Copyright 2006 by Johannes Hofmann +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +extern "C" { +#include <jpeglib.h> +} + +#include "JPEGOutputImage.H" + +JPEGOutputImage::JPEGOutputImage(const char *f, int quality) { +	file = strdup(f); +	fp = NULL; +	row = NULL; +} + +JPEGOutputImage::~JPEGOutputImage() { +	if (row) { +		free(row); +	} +	if (file) { +		free(file); +	} +} + +int +JPEGOutputImage::init_internal(int w1, int h1) { +	if (row) { +		free(row); +		row = NULL; +	} + +	row = (unsigned char*) malloc(sizeof(char) * 3 * W); +	if (!row) { +		perror("malloc"); +		return 1; +	} +	memset(row, 0, sizeof(char) * 3 * W); + +	if (fp) { +		fclose(fp); +	} + +	if ((fp = fopen(file, "wb")) == NULL) { +		fprintf(stderr, "can't open %s\n", file); +		return 1; +	} + +	cinfo.err = jpeg_std_error(&jerr); +	jpeg_create_compress(&cinfo); +	jpeg_stdio_dest(&cinfo, fp); +	cinfo.image_width = W; +	cinfo.image_height = H; +	cinfo.input_components = 3;          /* # of color components per pixel */ +	cinfo.in_color_space = JCS_RGB; + +	jpeg_set_defaults(&cinfo); +	jpeg_set_quality(&cinfo, quality, TRUE); + +	jpeg_start_compress(&cinfo, TRUE); + +} + +int +JPEGOutputImage::set_pixel_internal(int x, char r, char g, char b) { +	row[x*3+0] = r; +	row[x*3+1] = g; +	row[x*3+2] = b; + +	return 0; +} + +int +JPEGOutputImage::next_line_internal() { +	JSAMPROW row_pointer[1]; + +	row_pointer[0] = row; +	jpeg_write_scanlines(&cinfo, &row_pointer, 1); +	memset(row, 0, sizeof(char) * 3 * W); +	return 0; +} + +int +JPEGOutputImage::done_internal() { +	next_line_internal(); +	jpeg_finish_compress(&cinfo); +	fclose(fp); +	fp = NULL; +	jpeg_destroy_compress(&cinfo); +	if (row) { +		free(row); +	} + +	if (fp) { +		fclose(fp); +		fp = NULL; +	} +	return 0; +}	 + diff --git a/src/gipfel.cxx b/src/gipfel.cxx index 8256cd8..8e0e1b9 100644 --- a/src/gipfel.cxx +++ b/src/gipfel.cxx @@ -457,8 +457,8 @@ static int stitch(int stitch_w, int stitch_h, int argc, char **argv) {    win->show(0, argv);  -  //st->set_output((OutputImage*) new JPEGOutputImage("/tmp/bla.jpg", 90)); -  st->set_output((OutputImage*) img); +  st->set_output((OutputImage*) new JPEGOutputImage("/tmp/bla.jpg", 90)); +  //st->set_output((OutputImage*) img);    st->resample(stitch_w, stitch_h, 0.0, 7.0);    img->redraw();    Fl::run(); | 
