[gil io_new] Problem writing a compressed jpeg

Hi all, I am currently trying to write a compressed jpeg image without any success. Here is my code: #include <string> #include <boost/mpl/vector.hpp> #include <boost/gil/gil_all.hpp> #include <boost/gil/extension/io_new/tiff_read.hpp> #include <boost/gil/extension/io_new/tiff_write.hpp> #include <boost/gil/extension/io_new/jpeg_read.hpp> #include <boost/gil/extension/io_new/jpeg_write.hpp> using namespace std; using namespace boost; using namespace gil; int main(int argc, char** argv) { string base_image_path(argv[1]); string output_image_path(argv[2]); string output_compressed_image_path(argv[3]); typedef mpl::vector< rgb8_image_t, rgb16_image_t > rgb_image_types; typedef any_image<rgb_image_types> any_image_type; typedef any_image_type::view_t any_view_type; // Read tiff image image_read_info< tiff_tag > info = read_image_info( base_image_path , tiff_tag() ); any_image_type input_image; read_image(base_image_path.c_str(), input_image, tiff_tag()); write_view(output_image_path.c_str(), view(input_image), jpeg_tag()); image_write_info< jpeg_tag > compressed_jpeg_info; compressed_jpeg_info._quality = 30; //compressed_jpeg_info._dct_method = jpeg_dct_method::fastest; write_view(output_compressed_image_path.c_str(), view(input_image), compressed_jpeg_info); } Could you please help me ? Regards, Olivier

Hi Olivier, your code looks good and runs on my machine without any problems. Could you please describe what your problem is? Please make sure you have the latest of gil and gil::io_new BTW, you can pass strings into the io_new interface. No need for c_str(). Also the jpeg_dct_method::fastest parameter works just fine. Regards, Christian On Tue, Jun 1, 2010 at 8:57 PM, Olivier Tournaire <olitour@gmail.com> wrote:
Hi all,
I am currently trying to write a compressed jpeg image without any success. Here is my code:
#include <string>
#include <boost/mpl/vector.hpp>
#include <boost/gil/gil_all.hpp> #include <boost/gil/extension/io_new/tiff_read.hpp> #include <boost/gil/extension/io_new/tiff_write.hpp> #include <boost/gil/extension/io_new/jpeg_read.hpp> #include <boost/gil/extension/io_new/jpeg_write.hpp>
using namespace std; using namespace boost; using namespace gil;
int main(int argc, char** argv) { string base_image_path(argv[1]); string output_image_path(argv[2]); string output_compressed_image_path(argv[3]);
typedef mpl::vector< rgb8_image_t, rgb16_image_t > rgb_image_types; typedef any_image<rgb_image_types> any_image_type; typedef any_image_type::view_t any_view_type;
// Read tiff image image_read_info< tiff_tag > info = read_image_info( base_image_path , tiff_tag() );
any_image_type input_image; read_image(base_image_path.c_str(), input_image, tiff_tag());
write_view(output_image_path.c_str(), view(input_image), jpeg_tag());
image_write_info< jpeg_tag > compressed_jpeg_info; compressed_jpeg_info._quality = 30; //compressed_jpeg_info._dct_method = jpeg_dct_method::fastest; write_view(output_compressed_image_path.c_str(), view(input_image), compressed_jpeg_info); }
Could you please help me ?
Regards,
Olivier
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users

Hi Christian, 2010/6/2 Christian Henning <chhenning@gmail.com>
Hi Olivier, your code looks good and runs on my machine without any problems. Could you please describe what your problem is? Please make sure you have the latest of gil and gil::io_new
The code works. However, the output image is not compressed. It has the same size (in octets) as the one which uses the default jpeg_tag.
BTW, you can pass strings into the io_new interface. No need for c_str(). Also the jpeg_dct_method::fastest parameter works just fine.
Could yo please also tell me more about this parameter? Regards, Olivier
Regards, Christian
On Tue, Jun 1, 2010 at 8:57 PM, Olivier Tournaire <olitour@gmail.com> wrote:
Hi all,
I am currently trying to write a compressed jpeg image without any success. Here is my code:
#include <string>
#include <boost/mpl/vector.hpp>
#include <boost/gil/gil_all.hpp> #include <boost/gil/extension/io_new/tiff_read.hpp> #include <boost/gil/extension/io_new/tiff_write.hpp> #include <boost/gil/extension/io_new/jpeg_read.hpp> #include <boost/gil/extension/io_new/jpeg_write.hpp>
using namespace std; using namespace boost; using namespace gil;
int main(int argc, char** argv) { string base_image_path(argv[1]); string output_image_path(argv[2]); string output_compressed_image_path(argv[3]);
typedef mpl::vector< rgb8_image_t, rgb16_image_t > rgb_image_types; typedef any_image<rgb_image_types> any_image_type; typedef any_image_type::view_t any_view_type;
// Read tiff image image_read_info< tiff_tag > info = read_image_info( base_image_path , tiff_tag() );
any_image_type input_image; read_image(base_image_path.c_str(), input_image, tiff_tag());
write_view(output_image_path.c_str(), view(input_image), jpeg_tag());
image_write_info< jpeg_tag > compressed_jpeg_info; compressed_jpeg_info._quality = 30; //compressed_jpeg_info._dct_method = jpeg_dct_method::fastest; write_view(output_compressed_image_path.c_str(), view(input_image), compressed_jpeg_info); }
Could you please help me ?
Regards,
Olivier
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users

Hi Olivier,
The code works. However, the output image is not compressed. It has the same size (in octets) as the one which uses the default jpeg_tag.
On my system the jpeg with quality set to 100% is 20KB, whereas the one with 30% for quality is only 4KB. Could you set a breakpoint in boost\gil\extension\io_new\formats\jpeg\write.hpp[119]? That's where the quality is set.
BTW, you can pass strings into the io_new interface. No need for c_str(). Also the jpeg_dct_method::fastest parameter works just fine.
Could yo please also tell me more about this parameter?
The dct parameter stands for discrete cosine transformation and it's for selecting the appropriate method to do that transformation. In some cases those calculation can be quite expensive. Regards, Christian

Hi Christian, 2010/6/2 Christian Henning <chhenning@gmail.com>
Hi Olivier,
The code works. However, the output image is not compressed. It has the
same
size (in octets) as the one which uses the default jpeg_tag.
On my system the jpeg with quality set to 100% is 20KB, whereas the one with 30% for quality is only 4KB. Could you set a breakpoint in boost\gil\extension\io_new\formats\jpeg\write.hpp[119]? That's where the quality is set.
It finally works on one of my computer ... but on another one, I get a compilation error. Here is the (long) message : /usr/local/include/boost/gil/extension/io_new/formats/jpeg/write.hpp: In function ‘typename Op::result_type boost::gil::detail::apply_operation_base(Bits&, size_t, const Info&, Op) [with Types = boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0>, Info = boost::gil::image_write_info<boost::gil::jpeg_tag, boost::gil::detail::no_log>, Bits = boost::gil::variant<boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*> , boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0> >::base_t, Op = boost::gil::detail::dynamic_io_fnobj<boost::gil::detail::jpeg_write_is_supported, boost::gil::detail::writer<boost::gil::detail::file_stream_device<boost::gil::jpeg_tag>, boost::gil::jpeg_tag, boost::gil::detail::no_log> >]’:
/usr/local/include/boost/gil/extension/io_new/formats/jpeg/write.hpp:269: *instantiated from ‘typename BinaryOp::result_type boost::gil::detail::apply_**operation*(const boost::gil::variant<Types>&, const Info&, BinaryOp) [with Types1 = boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0>, Info = boost::gil::image_write_info<boost::gil::jpeg_tag, boost::gil::detail::no_log>, BinaryOp = boost::gil::detail::dynamic_io_fnobj<boost::gil::detail::jpeg_write_is_supported, boost::gil::detail::writer<boost::gil::detail::file_stream_device<boost::gil::jpeg_tag>, boost::gil::jpeg_tag, boost::gil::detail::no_log> >]’
/usr/local/include/boost/gil/extension/io_new/formats/jpeg/write.hpp:309: instantiated from ‘void boost::gil::detail::dynamic_image_writer<Device, boost::gil::jpeg_tag, boost::gil::detail::no_log>::apply(const boost::gil::any_image_view<Views>&, const boost::gil::image_write_info<boost::gil::jpeg_tag, boost::gil::detail::no_log>&) [with Views = boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0>, Device = boost::gil::detail::file_stream_device<boost::gil::jpeg_tag>]’
/usr/local/include/boost/gil/extension/io_new/detail/write_view.hpp:302: *instantiated from ‘void boost::gil::write_view*(Device&, const boost::gil::any_image_view<Types2>&, const boost::gil::image_write_info<FormatTag, Log>&, typename boost::enable_if<typename boost::mpl::and_<typename boost::gil::detail::is_output_device<IODevice>::type, typename boost::gil::is_format_tag<FormatTag>::type, mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> >::type, void>::type*) [with Device = boost::gil::detail::file_stream_device<boost::gil::jpeg_tag>, Views = boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0>, FormatTag = boost::gil::jpeg_tag, Log = boost::gil::detail::no_log]’
/usr/local/include/boost/gil/extension/io_new/detail/write_view.hpp:357: *instantiated from ‘void boost::gil::write_view*(const String&, const boost::gil::any_image_view<Types2>&, const boost::gil::image_write_info<FormatTag, Log>&, typename boost::enable_if<typename boost::mpl::and_<typename boost::gil::detail::is_supported_path_spec<P>::type, typename boost::gil::is_format_tag<FormatTag>::type, mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> >::type, void>::type*) [with String = const char*, Views = boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0>, FormatTag = boost::gil::jpeg_tag, Log = boost::gil::detail::no_log]’
/home/olivier/work/dev/OTO_DEV/projects/tif2jpeg_for_itowns_viewer/main_tif2jpeg_for_itowns_viewer.cpp:43: instantiated from here /usr/local/include/boost/gil/extension/io_new/formats/jpeg/write.hpp:244: *error: no matching function for call to ‘boost::gil::detail::apply_** operation_fwd_fn<2ul>::apply*(boost::gil::variant<boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0> >::base_t&, size_t&, const boost::gil::image_write_info<boost::gil::jpeg_tag, boost::gil::detail::no_log>&, boost::gil::detail::dynamic_io_fnobj<boost::gil::detail::jpeg_write_is_supported, boost::gil::detail::writer<boost::gil::detail::file_stream_device<boost::gil::jpeg_tag>, boost::gil::jpeg_tag, boost::gil::detail::no_log> >&)’
/usr/local/include/boost/gil/extension/io_new/formats/jpeg/write.hpp:244: *error: return-statement with a value, in function returning 'void'* If I comment the info parameter on line 242 of formats/jpeg/write.hpp, the compilation error disappears, but, the infos are not passed to the writer, what explain why my image is not compressed (the parameters are set to their default values). Could you please help on how to fix this error? I am on a linux ubuntu karmic koala, boost 1.42, libjpeg 6.2, g++ 4.3.4 Best regards, Olivier
BTW, you can pass strings into the io_new interface. No need for c_str(). Also the jpeg_dct_method::fastest parameter works just fine.
Could yo please also tell me more about this parameter?
The dct parameter stands for discrete cosine transformation and it's for selecting the appropriate method to do that transformation. In some cases those calculation can be quite expensive.
Regards, Christian _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users

Sorry for the mess, it was my mistake. Please do not take care of my previous mail. Regards, Olivier 2010/6/7 Olivier Tournaire <olitour@gmail.com>
Hi Christian,
2010/6/2 Christian Henning <chhenning@gmail.com>
Hi Olivier,
The code works. However, the output image is not compressed. It has the
same
size (in octets) as the one which uses the default jpeg_tag.
On my system the jpeg with quality set to 100% is 20KB, whereas the one with 30% for quality is only 4KB. Could you set a breakpoint in boost\gil\extension\io_new\formats\jpeg\write.hpp[119]? That's where the quality is set.
It finally works on one of my computer ... but on another one, I get a compilation error. Here is the (long) message :
/usr/local/include/boost/gil/extension/io_new/formats/jpeg/write.hpp: In function ‘typename Op::result_type boost::gil::detail::apply_operation_base(Bits&, size_t, const Info&, Op) [with Types = boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0>, Info = boost::gil::image_write_info<boost::gil::jpeg_tag, boost::gil::detail::no_log>, Bits = boost::gil::variant<boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*> , boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0> >::base_t, Op = boost::gil::detail::dynamic_io_fnobj<boost::gil::detail::jpeg_write_is_supported, boost::gil::detail::writer<boost::gil::detail::file_stream_device<boost::gil::jpeg_tag>, boost::gil::jpeg_tag, boost::gil::detail::no_log> >]’:
/usr/local/include/boost/gil/extension/io_new/formats/jpeg/write.hpp:269: *instantiated from ‘typename BinaryOp::result_type boost::gil::detail::apply_**operation*(const boost::gil::variant<Types>&, const Info&, BinaryOp) [with Types1 = boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0>, Info = boost::gil::image_write_info<boost::gil::jpeg_tag, boost::gil::detail::no_log>, BinaryOp = boost::gil::detail::dynamic_io_fnobj<boost::gil::detail::jpeg_write_is_supported, boost::gil::detail::writer<boost::gil::detail::file_stream_device<boost::gil::jpeg_tag>, boost::gil::jpeg_tag, boost::gil::detail::no_log> >]’
/usr/local/include/boost/gil/extension/io_new/formats/jpeg/write.hpp:309: instantiated from ‘void boost::gil::detail::dynamic_image_writer<Device, boost::gil::jpeg_tag, boost::gil::detail::no_log>::apply(const boost::gil::any_image_view<Views>&, const boost::gil::image_write_info<boost::gil::jpeg_tag, boost::gil::detail::no_log>&) [with Views = boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0>, Device = boost::gil::detail::file_stream_device<boost::gil::jpeg_tag>]’
/usr/local/include/boost/gil/extension/io_new/detail/write_view.hpp:302: *instantiated from ‘void boost::gil::write_view*(Device&, const boost::gil::any_image_view<Types2>&, const boost::gil::image_write_info<FormatTag, Log>&, typename boost::enable_if<typename boost::mpl::and_<typename boost::gil::detail::is_output_device<IODevice>::type, typename boost::gil::is_format_tag<FormatTag>::type, mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> >::type, void>::type*) [with Device = boost::gil::detail::file_stream_device<boost::gil::jpeg_tag>, Views = boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0>, FormatTag = boost::gil::jpeg_tag, Log = boost::gil::detail::no_log]’
/usr/local/include/boost/gil/extension/io_new/detail/write_view.hpp:357: *instantiated from ‘void boost::gil::write_view*(const String&, const boost::gil::any_image_view<Types2>&, const boost::gil::image_write_info<FormatTag, Log>&, typename boost::enable_if<typename boost::mpl::and_<typename boost::gil::detail::is_supported_path_spec<P>::type, typename boost::gil::is_format_tag<FormatTag>::type, mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> >::type, void>::type*) [with String = const char*, Views = boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0>, FormatTag = boost::gil::jpeg_tag, Log = boost::gil::detail::no_log]’
/home/olivier/work/dev/OTO_DEV/projects/tif2jpeg_for_itowns_viewer/main_tif2jpeg_for_itowns_viewer.cpp:43: instantiated from here
/usr/local/include/boost/gil/extension/io_new/formats/jpeg/write.hpp:244: *error: no matching function for call to ‘boost::gil::detail::apply_** operation_fwd_fn<2ul>::apply*(boost::gil::variant<boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb16_pixel_t*>
, boost::mpl::v_item<boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::rgb8_pixel_t*> , boost::mpl::vector0<mpl_::na>, 0>, 0> >::base_t&, size_t&, const boost::gil::image_write_info<boost::gil::jpeg_tag, boost::gil::detail::no_log>&, boost::gil::detail::dynamic_io_fnobj<boost::gil::detail::jpeg_write_is_supported, boost::gil::detail::writer<boost::gil::detail::file_stream_device<boost::gil::jpeg_tag>, boost::gil::jpeg_tag, boost::gil::detail::no_log> >&)’
/usr/local/include/boost/gil/extension/io_new/formats/jpeg/write.hpp:244: *error: return-statement with a value, in function returning 'void'*
If I comment the info parameter on line 242 of formats/jpeg/write.hpp, the compilation error disappears, but, the infos are not passed to the writer, what explain why my image is not compressed (the parameters are set to their default values). Could you please help on how to fix this error? I am on a linux ubuntu karmic koala, boost 1.42, libjpeg 6.2, g++ 4.3.4
Best regards,
Olivier
BTW, you can pass strings into the io_new interface. No need for c_str(). Also the jpeg_dct_method::fastest parameter works just fine.
Could yo please also tell me more about this parameter?
The dct parameter stands for discrete cosine transformation and it's for selecting the appropriate method to do that transformation. In some cases those calculation can be quite expensive.
Regards, Christian _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (2)
-
Christian Henning
-
Olivier Tournaire