123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- //
- // 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 <cstdio> // jpeglib doesn't know about FILE
- #include <jerror.h>
- #include <jpeglib.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
|