// // Copyright 2007-2012 Christian Henning, Andreas Pokorny, Lubomir Bourdev // // Distributed under 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 // 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 #include // jpeglib doesn't know about FILE #include #include #ifndef BOOST_GIL_EXTENSION_IO_JPEG_C_LIB_COMPILED_AS_CPLUSPLUS } #endif #include 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() : 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