00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef GIL_JPEG_IO_H
00014 #define GIL_JPEG_IO_H
00015
00022
00023 #include <cstdio>
00024 #include <algorithm>
00025 #include <string>
00026 #include <boost/static_assert.hpp>
00027 #include <boost/shared_ptr.hpp>
00028 extern "C" {
00029 #include <jpeglib.h>
00030 }
00031 #include "io_error.hpp"
00032 #include "jpeg_io_private.hpp"
00033
00034 namespace boost { namespace gil {
00035
00038 template <typename View>
00039 struct jpeg_read_support {
00040 BOOST_STATIC_CONSTANT(bool,is_supported=
00041 (detail::jpeg_read_support_private<typename channel_type<View>::type,
00042 typename color_space_type<View>::type>::is_supported));
00043 BOOST_STATIC_CONSTANT(J_COLOR_SPACE,color_type=
00044 (detail::jpeg_read_support_private<typename channel_type<View>::type,
00045 typename color_space_type<View>::type>::color_type));
00046 BOOST_STATIC_CONSTANT(bool, value=is_supported);
00047 };
00048
00052 inline point2<std::ptrdiff_t> jpeg_read_dimensions(const char* filename) {
00053 detail::jpeg_reader m(filename);
00054 return m.get_dimensions();
00055 }
00056
00060 inline point2<std::ptrdiff_t> jpeg_read_dimensions(const std::string& filename) {
00061 return jpeg_read_dimensions(filename.c_str());
00062 }
00063
00069 template <typename View>
00070 inline void jpeg_read_view(const char* filename,const View& view) {
00071 BOOST_STATIC_ASSERT(jpeg_read_support<View>::is_supported);
00072
00073 detail::jpeg_reader m(filename);
00074 m.apply(view);
00075 }
00076
00079 template <typename View>
00080 inline void jpeg_read_view(const std::string& filename,const View& view) {
00081 jpeg_read_view(filename.c_str(),view);
00082 }
00083
00089 template <typename Image>
00090 inline void jpeg_read_image(const char* filename,Image& im) {
00091 BOOST_STATIC_ASSERT(jpeg_read_support<typename Image::view_t>::is_supported);
00092
00093 detail::jpeg_reader m(filename);
00094 m.read_image(im);
00095 }
00096
00099 template <typename Image>
00100 inline void jpeg_read_image(const std::string& filename,Image& im) {
00101 jpeg_read_image(filename.c_str(),im);
00102 }
00103
00107 template <typename View,typename CC>
00108 inline void jpeg_read_and_convert_view(const char* filename,const View& view,CC cc) {
00109 detail::jpeg_reader_color_convert<CC> m(filename,cc);
00110 m.apply(view);
00111 }
00112
00116 template <typename View>
00117 inline void jpeg_read_and_convert_view(const char* filename,const View& view) {
00118 detail::jpeg_reader_color_convert<default_color_converter> m(filename,default_color_converter());
00119 m.apply(view);
00120 }
00121
00124 template <typename View,typename CC>
00125 inline void jpeg_read_and_convert_view(const std::string& filename,const View& view,CC cc) {
00126 jpeg_read_and_convert_view(filename.c_str(),view);
00127 }
00128
00131 template <typename View>
00132 inline void jpeg_read_and_convert_view(const std::string& filename,const View& view) {
00133 jpeg_read_and_convert_view(filename.c_str(),view);
00134 }
00135
00139 template <typename Image,typename CC>
00140 inline void jpeg_read_and_convert_image(const char* filename,Image& im,CC cc) {
00141 detail::jpeg_reader_color_convert<CC> m(filename,cc);
00142 m.read_image(im);
00143 }
00144
00148 template <typename Image>
00149 inline void jpeg_read_and_convert_image(const char* filename,Image& im) {
00150 detail::jpeg_reader_color_convert<default_color_converter> m(filename,default_color_converter());
00151 m.read_image(im);
00152 }
00153
00156 template <typename Image,typename CC>
00157 inline void jpeg_read_and_convert_image(const std::string& filename,Image& im,CC cc) {
00158 jpeg_read_and_convert_image(filename.c_str(),im);
00159 }
00160
00163 template <typename Image>
00164 inline void jpeg_read_and_convert_image(const std::string& filename,Image& im) {
00165 jpeg_read_and_convert_image(filename.c_str(),im);
00166 }
00167
00170 template <typename View>
00171 struct jpeg_write_support {
00172 BOOST_STATIC_CONSTANT(bool,is_supported=
00173 (detail::jpeg_write_support_private<typename channel_type<View>::type,
00174 typename color_space_type<View>::type>::is_supported));
00175 BOOST_STATIC_CONSTANT(J_COLOR_SPACE,color_type=
00176 (detail::jpeg_write_support_private<typename channel_type<View>::type,
00177 typename color_space_type<View>::type>::color_type));
00178 BOOST_STATIC_CONSTANT(bool, value=is_supported);
00179 };
00180
00185 template <typename View>
00186 inline void jpeg_write_view(const char* filename,const View& view,int quality=100) {
00187 BOOST_STATIC_ASSERT(jpeg_write_support<View>::is_supported);
00188
00189 detail::jpeg_writer m(filename);
00190 m.apply(view,quality);
00191 }
00192
00195 template <typename View>
00196 inline void jpeg_write_view(const std::string& filename,const View& view,int quality=100) {
00197 jpeg_write_view(filename.c_str(),view,quality);
00198 }
00199
00200 } }
00201
00202 #endif