diff options
Diffstat (limited to 'boost/gil/extension/io/jpeg/tags.hpp')
-rw-r--r-- | boost/gil/extension/io/jpeg/tags.hpp | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/boost/gil/extension/io/jpeg/tags.hpp b/boost/gil/extension/io/jpeg/tags.hpp new file mode 100644 index 0000000000..047b5cbfd5 --- /dev/null +++ b/boost/gil/extension/io/jpeg/tags.hpp @@ -0,0 +1,244 @@ +/* + Copyright 2007-2012 Christian Henning, Andreas Pokorny, Lubomir Bourdev + Use, modification and distribution are subject to the Boost Software License, + Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at + http://www.boost.org/LICENSE_1_0.txt). +*/ + +/*************************************************************************************************/ + +#ifndef BOOST_GIL_EXTENSION_IO_JPEG_TAGS_HPP +#define BOOST_GIL_EXTENSION_IO_JPEG_TAGS_HPP + +//////////////////////////////////////////////////////////////////////////////////////// +/// \file +/// \brief All supported jpeg tags by the gil io extension. +/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n +/// +/// \date 2007-2012 \n +/// +//////////////////////////////////////////////////////////////////////////////////////// + +// taken from jpegxx - https://bitbucket.org/edd/jpegxx/src/ea2492a1a4a6/src/ijg_headers.hpp +#ifndef BOOST_GIL_EXTENSION_IO_JPEG_C_LIB_COMPILED_AS_CPLUSPLUS + extern "C" { +#else + // DONT_USE_EXTERN_C introduced in v7 of the IJG library. + // By default the v7 IJG headers check for __cplusplus being defined and + // wrap the content in an 'extern "C"' block if it's present. + // When DONT_USE_EXTERN_C is defined, this wrapping is not performed. + #ifndef DONT_USE_EXTERN_C + #define DONT_USE_EXTERN_C 1 + #endif +#endif + +//jpeglib doesn't know about FILE +#include <stdio.h> + +#include <jpeglib.h> +#include <jerror.h> + +#ifndef BOOST_GIL_EXTENSION_IO_JPEG_C_LIB_COMPILED_AS_CPLUSPLUS + } +#endif + +#include <boost/gil/io/base.hpp> + +namespace boost { namespace gil { + +/// Defines jpeg tag. +struct jpeg_tag : format_tag {}; + +/// see http://en.wikipedia.org/wiki/JPEG for reference + +/// Defines type for image width property. +struct jpeg_image_width : property_base< JDIMENSION > {}; + +/// Defines type for image height property. +struct jpeg_image_height : property_base< JDIMENSION > {}; + +/// Defines type for number of components property. +struct jpeg_num_components : property_base< int > {}; + +/// Defines type for color space property. +struct jpeg_color_space : property_base< J_COLOR_SPACE > {}; + +/// Defines type for jpeg quality property. +struct jpeg_quality : property_base< int > +{ + static const type default_value = 100; +}; + +/// Defines type for data precision property. +struct jpeg_data_precision : property_base< int > {}; + +/// JFIF code for pixel size units +struct jpeg_density_unit : property_base< UINT8 > +{ + static const type default_value = 0; +}; + +/// pixel density +struct jpeg_pixel_density : property_base< UINT16 > +{ + static const type default_value = 0; +}; + +/// Defines type for dct ( discrete cosine transformation ) method property. +struct jpeg_dct_method : property_base< J_DCT_METHOD > +{ + static const type slow = JDCT_ISLOW; + static const type fast = JDCT_IFAST; + static const type floating_pt = JDCT_FLOAT; + static const type fastest = JDCT_FASTEST; + + static const type default_value = slow; +}; + +/// Read information for jpeg images. +/// +/// The structure is returned when using read_image_info. +template<> +struct image_read_info< jpeg_tag > +{ + image_read_info() + : _width ( 0 ) + , _height( 0 ) + + , _num_components( 0 ) + + , _color_space( J_COLOR_SPACE( 0 )) + + , _data_precision( 0 ) + + , _density_unit ( 0 ) + , _x_density ( 0 ) + , _y_density ( 0 ) + + , _pixel_width_mm ( 0.0 ) + , _pixel_height_mm( 0.0 ) + {} + + /// The image width. + jpeg_image_width::type _width; + + /// The image height. + jpeg_image_height::type _height; + + /// The number of channels. + jpeg_num_components::type _num_components; + + /// The color space. + jpeg_color_space::type _color_space; + + /// The width of channel. + /// I believe this number is always 8 in the case libjpeg is built with 8. + /// see: http://www.asmail.be/msg0055405033.html + jpeg_data_precision::type _data_precision; + + /// Density conversion unit. + jpeg_density_unit::type _density_unit; + jpeg_pixel_density::type _x_density; + jpeg_pixel_density::type _y_density; + + /// Real-world dimensions + double _pixel_width_mm; + double _pixel_height_mm; +}; + +/// Read settings for jpeg images. +/// +/// The structure can be used for all read_xxx functions, except read_image_info. +template<> +struct image_read_settings< jpeg_tag > : public image_read_settings_base +{ + /// Default constructor + image_read_settings<jpeg_tag>() + : image_read_settings_base() + , _dct_method( jpeg_dct_method::default_value ) + {} + + /// Constructor + /// \param top_left Top left coordinate for reading partial image. + /// \param dim Dimensions for reading partial image. + /// \param dct_method Specifies dct method. + image_read_settings( const point_t& top_left + , const point_t& dim + , jpeg_dct_method::type dct_method = jpeg_dct_method::default_value + ) + : image_read_settings_base( top_left + , dim + ) + , _dct_method( dct_method ) + {} + + /// The dct ( discrete cosine transformation ) method. + jpeg_dct_method::type _dct_method; +}; + +/// Write information for jpeg images. +/// +/// The structure can be used for write_view() function. +template<> +struct image_write_info< jpeg_tag > +{ + /// Constructor + /// \param quality Defines the jpeg quality. + /// \param dct_method Defines the DCT method. + /// \param density_unit Defines the density unit. + /// \param x_density Defines the x density. + /// \param y_density Defines the y density. + image_write_info( const jpeg_quality::type quality = jpeg_quality::default_value + , const jpeg_dct_method::type dct_method = jpeg_dct_method::default_value + , const jpeg_density_unit::type density_unit = jpeg_density_unit::default_value + , const jpeg_pixel_density::type x_density = jpeg_pixel_density::default_value + , const jpeg_pixel_density::type y_density = jpeg_pixel_density::default_value + ) + : _quality ( quality ) + , _dct_method( dct_method ) + + , _density_unit( density_unit ) + , _x_density ( x_density ) + , _y_density ( y_density ) + {} + + /// The jpeg quality. + jpeg_quality::type _quality; + + /// The dct ( discrete cosine transformation ) method. + jpeg_dct_method::type _dct_method; + + /// Density conversion unit. + jpeg_density_unit::type _density_unit; + + /// Pixel density dimensions. + jpeg_pixel_density::type _x_density; + jpeg_pixel_density::type _y_density; + + /// Sets the pixel dimensions. + void set_pixel_dimensions( int image_width // in pixels + , int image_height // in pixels + , double pixel_width // in mm + , double pixel_height // in mm + ) + { + _density_unit = 2; // dots per cm + + _x_density = round( image_width / ( pixel_width / 10 )); + _y_density = round( image_height / ( pixel_height / 10 )); + } + +private: + + UINT16 round( double d ) + { + return static_cast< UINT16 >( d + 0.5 ); + } + +}; + + +} // namespace gil +} // namespace boost + +#endif |