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 に答える