This class read data from a jpeg file and store it in an image. More...
#include <jpeg.hpp>
Classes | |
class | grayscale_to_pixel32 |
Functor converting a grey level pixel to a ARGB pixel. More... | |
class | RGB_to_pixel32 |
Functor converting a RGB pixel to a ARGB pixel. More... | |
struct | source_manager |
Source manager that allow us to read from a std::istream. More... | |
Public Member Functions | |
reader (image &img) | |
Constructor. | |
reader (image &img, std::istream &f) | |
Constructor. Load an image from a jpeg file. | |
void | load (std::istream &f) |
Load an image from a jpeg file. | |
Private Member Functions | |
template<class Convert > | |
void | read_data (jpeg_decompress_struct &cinfo, const Convert &pixel_convert) |
Decompress a RGB jpeg image. | |
void | read_from_file (std::istream &f) |
Load an image from a jpeg file. | |
void | decompress (std::istream &f, jpeg_decompress_struct &cinfo) |
Decompress the data of a Jpeg file. | |
void | create_decompress_info (jpeg_decompress_struct &cinfo, source_manager &infile) const |
Initialize the jpeg decompression structure. | |
Private Attributes | |
image & | m_image |
The image in which we store the data we read. |
This class read data from a jpeg file and store it in an image.
Definition at line 79 of file jpeg.hpp.
claw::graphic::jpeg::reader::reader | ( | image & | img | ) |
Constructor.
img | The image in which the data will be stored. |
Definition at line 218 of file jpeg_reader.cpp.
00219 : m_image( img ) 00220 { 00221 00222 } // jpeg::reader::reader()
claw::graphic::jpeg::reader::reader | ( | image & | img, | |
std::istream & | f | |||
) |
void claw::graphic::jpeg::reader::create_decompress_info | ( | jpeg_decompress_struct & | cinfo, | |
source_manager & | infile | |||
) | const [private] |
Initialize the jpeg decompression structure.
cinfo | The structure to initialize. | |
infile | The source manager. |
Definition at line 344 of file jpeg_reader.cpp.
References claw__graphic__jpeg__source_manager__fill_input_buffer(), claw__graphic__jpeg__source_manager__init_source(), claw__graphic__jpeg__source_manager__skip_input_data(), claw__graphic__jpeg__source_manager__term_source(), and claw::graphic::jpeg::reader::source_manager::pub.
Referenced by read_from_file().
00345 { 00346 jpeg_create_decompress(&cinfo); 00347 00348 cinfo.src = &infile.pub; 00349 cinfo.client_data = &infile; 00350 00351 infile.pub.fill_input_buffer = 00352 claw__graphic__jpeg__source_manager__fill_input_buffer; 00353 infile.pub.skip_input_data = 00354 claw__graphic__jpeg__source_manager__skip_input_data; 00355 infile.pub.init_source = claw__graphic__jpeg__source_manager__init_source; 00356 infile.pub.resync_to_restart = jpeg_resync_to_restart; 00357 infile.pub.term_source = claw__graphic__jpeg__source_manager__term_source; 00358 } // jpeg::reader::create_decompress_info()
void claw::graphic::jpeg::reader::decompress | ( | std::istream & | f, | |
jpeg_decompress_struct & | cinfo | |||
) | [private] |
Decompress the data of a Jpeg file.
f | Jpeg file. | |
cinfo | Info on the decompression process (libjpeg concerned). |
Definition at line 298 of file jpeg_reader.cpp.
References CLAW_EXCEPTION, claw::graphic::jpeg::error_manager::error_string, claw::graphic::jpeg__error_manager__error_exit(), claw::graphic::jpeg::error_manager::pub, and claw::graphic::jpeg::error_manager::setjmp_buffer.
Referenced by read_from_file().
00299 { 00300 error_manager jerr; 00301 jpeg_error_mgr* jerr_saved = cinfo.err; 00302 00303 cinfo.err = jpeg_std_error(&jerr.pub); 00304 jerr.pub.error_exit = jpeg__error_manager__error_exit; 00305 00306 if ( setjmp(jerr.setjmp_buffer) ) 00307 { 00308 jpeg_abort_decompress(&cinfo); 00309 throw CLAW_EXCEPTION(jerr.error_string); 00310 } 00311 00312 jpeg_read_header(&cinfo, TRUE); 00313 jpeg_start_decompress( &cinfo ); 00314 00315 try 00316 { 00317 m_image.set_size( cinfo.image_width, cinfo.image_height ); 00318 00319 if ( cinfo.out_color_components == 3 ) 00320 read_data( cinfo, RGB_to_pixel32() ); 00321 else if ( cinfo.out_color_components == 1 ) 00322 read_data( cinfo, grayscale_to_pixel32() ); 00323 else 00324 throw CLAW_EXCEPTION( "invalid number of colors per channel" ); 00325 00326 jpeg_finish_decompress(&cinfo); 00327 } 00328 catch(...) 00329 { 00330 jpeg_abort_decompress(&cinfo); 00331 throw; 00332 } 00333 00334 cinfo.err = jerr_saved; 00335 } // jpeg::reader::decompress()
void claw::graphic::jpeg::reader::load | ( | std::istream & | f | ) |
Load an image from a jpeg file.
f | JPEG file. |
Definition at line 242 of file jpeg_reader.cpp.
References CLAW_PRECOND, and read_from_file().
Referenced by reader().
00243 { 00244 CLAW_PRECOND( !!f ); 00245 00246 std::istream::pos_type init_pos = f.tellg(); 00247 00248 try 00249 { 00250 read_from_file(f); 00251 } 00252 catch(...) 00253 { 00254 f.clear(); 00255 f.seekg( init_pos, std::ios_base::beg ); 00256 throw; 00257 } 00258 } // jpeg::reader::load()
void claw::graphic::jpeg::reader::read_data | ( | jpeg_decompress_struct & | cinfo, | |
const Convert & | pixel_convert | |||
) | [inline, private] |
cinfo | Informations about the decompression process. | |
pixel_convert | Operator to use to convert pixels from input. |
Definition at line 42 of file jpeg_reader.tpp.
References CLAW_EXCEPTION, claw::graphic::jpeg::error_manager::error_string, claw::graphic::jpeg__error_manager__error_exit(), claw::graphic::jpeg::error_manager::pub, and claw::graphic::jpeg::error_manager::setjmp_buffer.
00043 { 00044 const unsigned int pixel_size = cinfo.output_components; 00045 JSAMPLE* buffer = new JSAMPLE[cinfo.output_width * pixel_size]; 00046 00047 error_manager jerr; 00048 jpeg_error_mgr* jerr_saved = cinfo.err; 00049 00050 cinfo.err = jpeg_std_error(&jerr.pub); 00051 jerr.pub.error_exit = jpeg__error_manager__error_exit; 00052 00053 if ( setjmp(jerr.setjmp_buffer) ) 00054 { 00055 delete[] buffer; 00056 throw CLAW_EXCEPTION(jerr.error_string); 00057 } 00058 00059 while (cinfo.output_scanline < cinfo.output_height) 00060 { 00061 jpeg_read_scanlines(&cinfo, &buffer, 1); 00062 00063 scanline::iterator pixel = m_image[cinfo.output_scanline-1].begin(); 00064 00065 for ( unsigned int i=0; i!=pixel_size*m_image.width(); 00066 i+=pixel_size, ++pixel ) 00067 *pixel = pixel_convert( &buffer[i] ); 00068 } 00069 00070 delete[] buffer; 00071 cinfo.err = jerr_saved; 00072 } // jpeg::reader::read_data()
void claw::graphic::jpeg::reader::read_from_file | ( | std::istream & | f | ) | [private] |
Load an image from a jpeg file.
f | Jpeg file. |
Definition at line 265 of file jpeg_reader.cpp.
References CLAW_EXCEPTION, create_decompress_info(), decompress(), claw::graphic::jpeg::error_manager::error_string, claw::graphic::jpeg__error_manager__error_exit(), claw::graphic::jpeg::error_manager::pub, and claw::graphic::jpeg::error_manager::setjmp_buffer.
Referenced by load().
00266 { 00267 source_manager infile(f); 00268 jpeg_decompress_struct cinfo; 00269 error_manager jerr; 00270 00271 cinfo.err = jpeg_std_error(&jerr.pub); 00272 00273 if ( setjmp(jerr.setjmp_buffer) ) 00274 throw CLAW_EXCEPTION(jerr.error_string); 00275 00276 create_decompress_info( cinfo, infile ); 00277 jerr.pub.error_exit = jpeg__error_manager__error_exit; 00278 00279 try 00280 { 00281 decompress(f, cinfo); 00282 jpeg_destroy_decompress(&cinfo); 00283 } 00284 catch(...) 00285 { 00286 jpeg_destroy_decompress(&cinfo); 00287 throw; 00288 } 00289 } // jpeg::reader::read_from_file()
image& claw::graphic::jpeg::reader::m_image [private] |