core/vil/file_formats/vil_jpeg_compressor.cxx

Go to the documentation of this file.
00001 // This is core/vil/file_formats/vil_jpeg_compressor.cxx
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005 //:
00006 // \file
00007 // \author fsm
00008 // \verbatim
00009 //  Modifications
00010 //     11 Oct 2002 Ian Scott - converted to vil
00011 //\endverbatim
00012 
00013 #include "vil_jpeg_compressor.h"
00014 #include "vil_jpeg_destination_mgr.h"
00015 #include <vil/vil_stream.h>
00016 #include <vcl_iostream.h>
00017 
00018 vil_jpeg_compressor::vil_jpeg_compressor(vil_stream *s)
00019   : stream(s)
00020   , ready(false), quality(75)
00021 {
00022   stream->ref();
00023 
00024   // setup the standard error handler in the jpeg library
00025   jobj.err = jpeg_std_error(&jerr);
00026 
00027   // Zero just in case..
00028   jobj.next_scanline = 0;
00029 
00030   // construct the compression object :
00031   jpeg_create_compress(&jobj);
00032 
00033   // set the data destination
00034   vil_jpeg_stream_dst_set(&jobj, stream);
00035 }
00036 
00037 bool vil_jpeg_compressor::write_scanline(unsigned line, JSAMPLE const *scanline)
00038 {
00039   if (!ready) {
00040     // rewind the stream
00041     vil_jpeg_stream_dst_rewind(&jobj, stream);
00042 
00043     //
00044     jobj.next_scanline = 0;
00045 
00046     // set colorspace of input image. FIXME.
00047     switch (jobj.input_components) {
00048      case 1:
00049       jobj.in_color_space = JCS_GRAYSCALE;
00050       break;
00051      case 3:
00052       jobj.in_color_space = JCS_RGB;
00053       break;
00054      default:
00055       vcl_cerr << __FILE__ " : urgh!\n";
00056       return false;
00057     }
00058 
00059     jpeg_set_defaults(&jobj);
00060     jpeg_set_quality(&jobj, quality, TRUE);
00061 
00062     // start compression
00063     bool write_all_tables = true;
00064     jpeg_start_compress (&jobj, write_all_tables);
00065 
00066     //
00067     ready = true;
00068   }
00069 
00070   //
00071   if (line != jobj.next_scanline) {
00072     vcl_cerr << "scanlines must be written in order\n";
00073     return false;
00074   }
00075 
00076   // write the scanline
00077   { JSAMPLE *tmp = const_cast<JSAMPLE*>(scanline);
00078   jpeg_write_scanlines(&jobj, &tmp, 1); }
00079 
00080   // finish if the last scanline is written
00081   if (line == jobj.image_height - 1) {
00082     jpeg_finish_compress(&jobj);
00083     ready = false;
00084   }
00085 
00086   return true;
00087 }
00088 
00089 vil_jpeg_compressor::~vil_jpeg_compressor()
00090 {
00091   // finish compression if necessary
00092   if (ready)
00093     jpeg_finish_compress(&jobj);
00094 
00095   // destroy the compression object
00096   jpeg_destroy_compress(&jobj);
00097 
00098   //
00099   stream->unref();
00100   stream = 0;
00101 }
00102 
00103 void vil_jpeg_compressor::set_quality(int q)
00104 {
00105   quality = q;
00106 }
00107 
00108 int vil_jpeg_compressor::get_quality()
00109 {
00110   return quality;
00111 }

Generated on Sat Nov 22 05:07:51 2008 for core/vil by  doxygen 1.5.1