C++ 使用BOOST::GIL将CYMK图像转换为RGB

C++ 使用BOOST::GIL将CYMK图像转换为RGB,c++,boost,graphics,boost-gil,C++,Boost,Graphics,Boost Gil,我正在尝试使用boost通用图像库将CYMK图像转换为RGB 以下代码不编译 // read cmyk image file cmyk8_image_t img; jpeg_read_image( "1502-T2-C-PER.jpg", img ); // convert to rgb rgb8_image_t rgb( img.dimensions() ); copy_pixels( color_converted_view<rgb8_image_t>(view(img

我正在尝试使用boost通用图像库将CYMK图像转换为RGB

以下代码不编译

// read cmyk image file
cmyk8_image_t img;
jpeg_read_image( "1502-T2-C-PER.jpg", img );

// convert to rgb
rgb8_image_t rgb( img.dimensions() );
copy_pixels(
    color_converted_view<rgb8_image_t>(view(img)),
    view(rgb));
//读取cmyk图像文件
cmyk8_image_t img;
jpeg读取图像(“1502-T2-C-PER.jpg”,img);
//转换为rgb
rgb8_图像_t rgb(img.dimensions());
复制像素(
颜色转换视图(视图(img)),
视图(rgb));
有人知道怎么解决这个问题吗

我的代码基于教程代码

void x_luminosity_gradient(const rgb32fc_view_t& src, const gray8s_view_t& dst) {
    gray8_image_t ccv_image(src.dimensions());
    copy_pixels(color_converted_view<gray8_pixel_t>(src), view(ccv_image));
void x_亮度_梯度(常量rgb32fc_视图_t&src、常量gray8s_视图_t&dst){
灰度8_图像(src.dimensions());
复制像素(颜色转换视图(src)、视图(ccv图像));
以下是编译器输出:

1>c:\program files\boost\boost_1_35_0\boost\gil\step_iterator.hpp(164) : error C2664: 'boost::gil::detail::step_iterator_adaptor<Derived,Iterator,SFn>::step_iterator_adaptor(const Iterator &,SFn)' : cannot convert parameter 1 from 'const boost::gil::dereference_iterator_adaptor<Iterator,DFn>' to 'const boost::gil::rgb8_ptr_t &'
1>        with
1>        [
1>            Derived=boost::gil::memory_based_step_iterator<boost::gil::rgb8_ptr_t>,
1>            Iterator=boost::gil::rgb8_ptr_t ,
1>            SFn=boost::gil::memunit_step_fn<boost::gil::rgb8_ptr_t >
1>        ]
1>        and
1>        [
1>            Iterator=boost::gil::cmyk8_ptr_t ,
1>            DFn=boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_view_t,boost::gil::default_color_converter>
1>        ]
1>        Reason: cannot convert from 'const boost::gil::dereference_iterator_adaptor<Iterator,DFn>' to 'const boost::gil::rgb8_ptr_t '
1>        with
1>        [
1>            Iterator=boost::gil::cmyk8_ptr_t ,
1>            DFn=boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_view_t,boost::gil::default_color_converter>
1>        ]
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>        c:\program files\boost\boost_1_35_0\boost\gil\locator.hpp(271) : see reference to function template instantiation 'boost::gil::memory_based_step_iterator<Iterator>::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::pixel<ChannelValue,Layout>,DFn>>(const boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::pixel<ChannelValue,Layout>,DFn>> &)' being compiled
1>        with
1>        [
1>            Iterator=boost::gil::rgb8_ptr_t,
1>            ChannelValue=boost::gil::bits8,
1>            Layout=boost::gil::cmyk_layout_t,
1>            DFn=boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_view_t,boost::gil::default_color_converter>
1>        ]
1>        c:\program files\boost\boost_1_35_0\boost\gil\image_view.hpp(101) : see reference to function template instantiation 'boost::gil::memory_based_2d_locator<StepIterator>::memory_based_2d_locator<boost::gil::memory_based_step_iterator<Iterator>>(const boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<Iterator>> &)' being compiled
1>        with
1>        [
1>            StepIterator=boost::gil::memory_based_step_iterator<boost::gil::rgb8_ptr_t>,
1>            Iterator=boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_view_t,boost::gil::default_color_converter>>
1>        ]
1>        c:\documents and settings\james\my documents\code\animag\test\test.cpp(17) : see reference to function template instantiation 'boost::gil::image_view<Loc>::image_view<SrcView>(const View &)' being compiled
1>        with
1>        [
1>            Loc=boost::gil::rgb8_loc_t,
1>            SrcView=boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_view_t,boost::gil::default_color_converter>>>>>,
1>            View=boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_view_t,boost::gil::default_color_converter>>>>>
1>        ]
1>        c:\documents and settings\james\my documents\code\animag\test\test.cpp(48) : see reference to function template instantiation 'void processRGB<boost::gil::image_view<Loc>>(SrcView &)' being compiled
1>        with
1>        [
1>            Loc=boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_view_t,boost::gil::default_color_converter>>>>,
1>            SrcView=boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_view_t,boost::gil::default_color_converter>>>>>
1>        ]
1>c:\program files\boost\boost_1_35_0\boost\gil\pixel.hpp(146) : error C2440: '=' : cannot convert from 'const boost::gil::image<Pixel,IsPlanar,Alloc>' to 'boost::gil::bits8'
1>        with
1>        [
1>            Pixel=boost::gil::rgb8_pixel_t,
1>            IsPlanar=false,
1>            Alloc=std::allocator<unsigned char>
1>        ]
1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>        c:\program files\boost\boost_1_35_0\boost\gil\pixel.hpp(128) : see reference to function template instantiation 'void boost::gil::pixel<ChannelValue,Layout>::assign<P>(const Channel &,boost::mpl::false_)' being compiled
1>        with
1>        [
1>            ChannelValue=boost::gil::bits8,
1>            Layout=boost::gil::rgb_layout_t,
1>            P=boost::gil::image<boost::gil::rgb8_pixel_t,false,std::allocator<unsigned char>>,
1>            Channel=boost::gil::image<boost::gil::rgb8_pixel_t,false,std::allocator<unsigned char>>
1>        ]
1>        c:\program files\boost\boost_1_35_0\boost\gil\algorithm.hpp(236) : see reference to function template instantiation 'boost::gil::pixel<ChannelValue,Layout> &boost::gil::pixel<ChannelValue,Layout>::operator =<boost::gil::image<Pixel,IsPlanar,Alloc>>(const P &)' being compiled
1>        with
1>        [
1>            ChannelValue=boost::gil::bits8,
1>            Layout=boost::gil::rgb_layout_t,
1>            Pixel=boost::gil::rgb8_pixel_t,
1>            IsPlanar=false,
1>            Alloc=std::allocator<unsigned char>,
1>            P=boost::gil::image<boost::gil::rgb8_pixel_t,false,std::allocator<unsigned char>>
1>        ]
1>        c:\program files\boost\boost_1_35_0\boost\gil\algorithm.hpp(231) : while compiling class template member function 'void boost::gil::detail::copier_n<I,O>::operator ()(boost::gil::iterator_from_2d<Loc2>,__w64 int,boost::gil::iterator_from_2d<Loc>) const'
1>        with
1>        [
1>            I=boost::gil::iterator_from_2d<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8c_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_image_t,boost::gil::default_color_converter>>>>>,
1>            O=boost::gil::iterator_from_2d<boost::gil::rgb8_loc_t>,
1>            Loc2=boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8c_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_image_t,boost::gil::default_color_converter>>>>,
1>            Loc=boost::gil::rgb8_loc_t
1>        ]
1>        c:\program files\boost\boost_1_35_0\boost\gil\algorithm.hpp(266) : see reference to class template instantiation 'boost::gil::detail::copier_n<I,O>' being compiled
1>        with
1>        [
1>            I=boost::gil::iterator_from_2d<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8c_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_image_t,boost::gil::default_color_converter>>>>>,
1>            O=boost::gil::iterator_from_2d<boost::gil::rgb8_loc_t>
1>        ]
1>        c:\program files\boost\boost_1_35_0\boost\gil\algorithm.hpp(292) : see reference to function template instantiation 'DstIterator boost::gil::detail::copy_with_2d_iterators<boost::gil::iterator_from_2d<Loc2>,boost::gil::iterator_from_2d<Loc>>(SrcIterator,SrcIterator,DstIterator)' being compiled
1>        with
1>        [
1>            DstIterator=boost::gil::iterator_from_2d<boost::gil::rgb8_loc_t>,
1>            Loc2=boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8c_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_image_t,boost::gil::default_color_converter>>>>,
1>            Loc=boost::gil::rgb8_loc_t,
1>            SrcIterator=boost::gil::iterator_from_2d<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8c_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_image_t,boost::gil::default_color_converter>>>>>
1>        ]
1>        c:\documents and settings\james\my documents\code\animag\test\test.cpp(44) : see reference to function template instantiation 'void boost::gil::copy_pixels<boost::gil::image_view<Loc>,boost::gil::image_view<boost::gil::rgb8_loc_t>>(const View1 &,const View2 &)' being compiled
1>        with
1>        [
1>            Loc=boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8c_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_image_t,boost::gil::default_color_converter>>>>,
1>            View1=boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::dereference_iterator_adaptor<boost::gil::cmyk8c_ptr_t ,boost::gil::color_convert_deref_fn<const boost::gil::pixel<boost::gil::bits8,boost::gil::cmyk_layout_t> ,boost::gil::rgb8_image_t,boost::gil::default_color_converter>>>>>,
1>            View2=boost::gil::image_view<boost::gil::rgb8_loc_t>
1>        ]
1>c:\program files\boost\boost\boost\u 1\u 35\u 0\boost\gil\step\u iterator.hpp(164):错误C2664:'boost::gil::detail::step\u iterator\u adapter::step\u iterator\u adapter(const iterator&,SFn)':无法将参数1从'const boost::gil::dereference\u iterator\u adapter'转换为'const boost::gil::rgb8\u ptr&'
1> 与
1>        [
1> 派生=boost::gil::基于内存的步骤迭代器,
1> 迭代器=boost::gil::rgb8\u ptr\t,
1> SFn=boost::gil::memunit\u step\u fn
1>        ]
1> 及
1>        [
1> 迭代器=boost::gil::cmyk8\u ptr\t,
1> DFn=boost::gil::color\u convert\u deref\u fn
1>        ]
1> 原因:无法从“const boost::gil::dereference_iterator_adapter”转换为“const boost::gil::rgb8_ptr_t”
1> 与
1>        [
1> 迭代器=boost::gil::cmyk8\u ptr\t,
1> DFn=boost::gil::color\u convert\u deref\u fn
1>        ]
1> 没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符
1> c:\ProgramFiles\boost\boost\u 1\u 35\u 0\boost\gil\locator.hpp(271):请参阅正在编译的函数模板实例化“boost::gil::基于内存的步骤迭代器::基于内存的步骤迭代器(const boost::gil::基于内存的步骤迭代器&)”
1> 与
1>        [
1> 迭代器=boost::gil::rgb8\u ptr\t,
1> ChannelValue=boost::gil::bits8,
1> 布局=boost::gil::cmyk\u布局,
1> DFn=boost::gil::color\u convert\u deref\u fn
1>        ]
1> c:\program files\boost\boost\u 1\u 35\u 0\boost\gil\image\u view.hpp(101):请参阅正在编译的函数模板实例化“boost::gil::memory\u-based\u 2d\u locator::memory\u-based\u 2d\u locator(const-boost::gil::memory\u-based\u 2d\u locator&)”
1> 与
1>        [
1> StepIterator=boost::gil::基于内存的StepIterator,
1> 迭代器=boost::gil::解引用迭代器\u适配器
1>        ]
1> c:\documents and settings\james\my documents\code\animag\test\test.cpp(17):请参阅正在编译的函数模板实例化“boost::gil::image\u view::image\u view(const view&)”的参考
1> 与
1>        [
1> Loc=boost::gil::rgb8\u Loc\t,
1> SrcView=boost::gil::image\u视图,
1> 视图=boost::gil::image\u视图
1>        ]
1> c:\documents and settings\james\my documents\code\animag\test\test.cpp(48):请参阅正在编译的函数模板实例化“void processRGB(SrcView&)”的参考
1> 与
1>        [
1> Loc=boost::gil::基于内存的二维定位器,
1> SrcView=boost::gil::image\u视图
1>        ]
1> c:\program files\boost\boost\u 1\u 35\u 0\boost\gil\pixel.hpp(146):错误C2440:“=”:无法从“const boost::gil::image”转换为“boost::gil::bits8”
1> 与
1>        [
1> 像素=boost::gil::rgb8\u像素,
1> IsPlanar=false,
1> Alloc=std::分配器
1>        ]
1> 没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符
1> c:\ProgramFiles\boost\boost\u 1\u 35\u 0\boost\gil\pixel.hpp(128):请参阅正在编译的函数模板实例化“void boost::gil::pixel::assign

(const Channel&,boost::mpl::false)” 1> 与 1> [ 1> ChannelValue=boost::gil::bits8, 1> 布局=boost::gil::rgb\u布局, 1> P=boost::gil::image, 1> 通道=boost::gil::image 1> ] 1> c:\ProgramFiles\boost\boost\u 1\u 35\u 0\boost\gil\algorithm.hpp(236):请参阅正在编译的函数模板实例化“boost::gil::pixel&boost::gil::pixel::operator=(const P&)”的参考 1> 与 1> [ 1> ChannelValue=boost::gil::bits8, 1> 布局=boost::gil::rgb\u布局, 1> 像素=boost::gil::rgb8\u像素, 1> IsPlanar=false, 1> Alloc=std::分配器, 1> P=boost::gil::image 1> ] 1> c:\ProgramFiles\boost\boost\u 1\u 35\u 0\boost\gil\algorithm.hpp(231):在编译类模板成员函数“void boost::gil::detail::copier\u n::operator()(boost::gil::iterator\u from_2d,\uu w64 int,boost::gil::iterator\u from_2d)const” 1> 与 1> [ 1> I=boost::gil::迭代器, 1> O=boost::gil::迭代器, 1> Loc2=boost::gil::基于内存的二维定位器, 1> Loc=boost::gil::rgb8\u Loc\t 1> ] 1> c:\ProgramFiles\boost\boost\u 1\u 35\u 0\boost\gil\algorithm.hpp(266):请参阅正在编译的类模板实例化“boost::gil::detail::copier” 1> 与 1> [ 1> I=boost::gil::迭代器, 1> O=boost::gil::迭代器 1> ] 1> c:\program files\boost\boost\u 1\u 35\u 0\boost\gil\algorithm.hpp(292):请参阅正在编译的函数模板实例化“DstIterator boost::gil::detail::copy_with_2d_迭代器(srcierator,srcierator,DstIterator)” 1> 与 1> [ 1> DstIterator=boost::gil::iterator_from_2d, 1> Loc2=boost::gil::基于内存的二维定位器, 1> Loc=boost::gil::rgb8\u Loc\t, 1> srcierator=boost::gil::iterator_from_2d 1> ] 1> c:\documents and settings\james\my documents\code\animag\test\test。

// read cmyk image file
cmyk8_image_t img;
jpeg_read_image( "1502-T2-C-PER.jpg", img );

//// convert to rgb
rgb8_image_t rgb( img.dimensions() );
copy_pixels(
    color_converted_view<rgb8_pixel_t>(view(img)),
    view(rgb));