From 9c4d134ab304794b755139e90ca6da9de73a1e9a Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sun, 24 Aug 2008 18:52:10 +0000 Subject: JPEG screenshots --- src/render/jpgfile.cc | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/render/jpgfile.cc (limited to 'src/render/jpgfile.cc') diff --git a/src/render/jpgfile.cc b/src/render/jpgfile.cc new file mode 100644 index 0000000..74cdea9 --- /dev/null +++ b/src/render/jpgfile.cc @@ -0,0 +1,89 @@ +/* + render/jpgfile.cc + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2 +*/ + +/* +Notes: + +http://www.zarb.org/~gc/html/libpng.html + +*/ + +#include +#include + +#include "filesystem/filesystem.h" +#include "render/jpgfile.h" +#include "sys/sys.h" + +extern "C" { + #include "jpeglib.h" +} + +namespace render { + +Image *JPG::load(const char *filename) +{ + Image *image = 0; + + if (!filename) + return 0; + + filesystem::File *jpg_file = filesystem::open(filename); + if (!jpg_file) { + //con_warn << "Could not open " << filename << std::endl; + return 0; + } + + + filesystem::close(jpg_file); + +// con_debug << " " << filename << " " << png_width << "x" << png_height << "x" << channels * png_depth << "bpp" << std::endl; + + return image; +} + +void JPG::save(const char *filename, Image & image, int jpeg_quality) +{ + struct jpeg_compress_struct jpeg_compression_info; + struct jpeg_error_mgr jerr; + + JSAMPROW row_pointer[1]; + int row_stride; + + FILE *jpg_file = fopen(filename, "wb"); + if (!jpg_file) { + con_warn << "Could not write " << filename << std::endl; + return; + } + + jpeg_compression_info.err = jpeg_std_error(&jerr); + jpeg_create_compress(&jpeg_compression_info); + jpeg_stdio_dest(&jpeg_compression_info, jpg_file); + + jpeg_compression_info.image_width = image.width(); + jpeg_compression_info.image_height = image.height(); + jpeg_compression_info.input_components = image.channels(); + jpeg_compression_info.in_color_space = JCS_RGB; + + jpeg_set_defaults(&jpeg_compression_info); + jpeg_set_quality(&jpeg_compression_info, jpeg_quality, TRUE); + jpeg_start_compress(&jpeg_compression_info, TRUE); + row_stride = image.width() * image.channels(); + + while (jpeg_compression_info.next_scanline < jpeg_compression_info.image_height) { + row_pointer[0] = image[jpeg_compression_info.next_scanline * row_stride]; + jpeg_write_scanlines(&jpeg_compression_info, row_pointer, 1); + } + + jpeg_finish_compress(&jpeg_compression_info); + fclose(jpg_file); + + jpeg_destroy_compress(&jpeg_compression_info); + + con_print << "Wrote " << filename << std::endl; +} + +} -- cgit v1.2.3