1

我意识到写入gil::color_converted_view不会影响底层视图的数据。我想知道这是否正确?

例如,假设我想编写一个程序,将红色通道的值设置为蓝色通道的一半。这是我失败的尝试:

template <typename SrcView>
void half_red_to_blue(SrcView & view)
{
    // Since SrcView might be RGB or BGR or some other types,
    // I decided to use a color_converted_view to ensure that I'm
    // accessing the correct channels
    typedef gil::color_converted_view_type<SrcView, gil::rgb8_pixel_t>::type MyView;
    MyView my_view = gil::color_converted_view<gil::rgb8_pixel_t>(view):
    struct my_lambda
    {
        void operator()(gil::rgb8_pixel_t & p)
        {
            p[2] = p[0] / 2;
        }
    };
    gil::for_each_pixel(my_view, my_lambda());
}

但是,它仅在SrcView实际为 时才有效gil::rgb8_view_t。如果我打电话,例如half_red_to_blue<gil::bgr8_view_t>(view),视图根本不会改变!我在调试器中检查了一下,似乎写操作正在写入某种代理位置而不是原始像素。

有任何想法吗?提前致谢!

4

1 回答 1

0

这是 Boost.GIL 中的有效行为,因为只有在访问像素时才会触及像素的颜色分量。您可以修改 my_lambda::operator() 以使用 get_color 来触发颜色组件访问。

于 2010-12-10T16:30:45.630 回答