Использование boost :: gil :: color_converted_view с boost :: gil :: for_each_pixel - PullRequest
1 голос
/ 04 декабря 2010

Я понял, что запись в 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), вид не меняется вообще! Я немного проверил в отладчике, и похоже, что операция записи записывает данные в какое-то расположение прокси вместо исходных пикселей.

Есть идеи? Заранее спасибо!

1 Ответ

0 голосов
/ 10 декабря 2010

Это допустимое поведение в Boost.GIL, поскольку цветовые компоненты пикселя затрагиваются только при доступе к пикселю. Вы можете изменить my_lambda :: operator (), чтобы использовать get_color для запуска доступа к компоненту цвета.

...