如何使用GIL迭代器设置像素

时间:2019-07-17 20:11:11

标签: c++ boost boost-gil

尝试学习一些C ++,我对此很陌生。我的学习项目是使用各种算法(如分形)生成图像。我正在查看boost GIL库,因为boost似乎是周围最常见和已建立的C ++库。因此,我正在尝试在内存中创建图像,遍历像素并根据某些公式设置RGB值。我当前的代码如下:

int main() {
    rgb8_image_t img(IMAGE_W, IMAGE_H);
    auto b = view(img).begin();
    while (b != view(img).end()) {
        /* set the pixel value here */
        b++;
    }
    write_view("image.png", view(img), png_tag());
    return 0;
}

迭代似乎有效,但是我似乎无法从GIL文档中弄清楚如何在此循环中实际设置像素。我可以做一个嵌套的for循环,只使用x和y坐标设置像素,但是我有点想使用迭代器,因为它看起来更整洁,也许以后我可以重构它以使用transform()。我如何从这里开始?如何将像素设置为某些RGB值?

1 个答案:

答案 0 :(得分:1)

简单地,创建具有所需通道值的rgb8_pixel_t类型的值,并将其分配给迭代器指向的像素。

举一个简单的例子,它将用实心橙色填充图像:

#include <boost/gil.hpp>
#include <boost/gil/extension/io/png.hpp>
namespace gil = boost::gil;

int main()
{
    gil::rgb8_image_t img(100, 100);
    auto v = gil::view(img);
    auto b = v.begin();
    while (b != v.end())
    {
        *b = gil::rgb8_pixel_t{255, 128, 0};
        b++;
    }
    gil::write_view("image.png", gil::view(img), gil::png_tag());
}

对于更复杂的示例,以下是如何使用像素通道值的自定义生成器:

#include <boost/gil.hpp>
#include <boost/gil/extension/io/png.hpp>
#include <random>
namespace gil = boost::gil;

template <typename T>
struct random_value
{
    static_assert(std::is_integral<T>::value, "T must be integral type");
    static constexpr auto range_min = std::numeric_limits<T>::min();
    static constexpr auto range_max = std::numeric_limits<T>::max();

    random_value() : rng_(rd_()), uid_(range_min, range_max) {}

    T operator()()
    {
        auto value = uid_(rng_);
        return static_cast<T>(value);
    }

    std::random_device rd_;
    std::mt19937 rng_;
    std::uniform_int_distribution<typename gil::promote_integral<T>::type> uid_;
};

int main()
{
    random_value<channel_type<gil::rgb8_pixel_t>::type> make_channel_value;

    gil::rgb8_image_t img(100, 100);
    auto v = gil::view(img);
    auto b = v.begin();
    while (b != v.end())
    {
        // generate random value for each channel of RGB image separately
        gil::static_generate(*b, [&make_channel_value]() { return make_channel_value(); });
        b++;
    }
    gil::write_view("image.png", gil::view(img), gil::png_tag());
}

更新:static_generateGIL algorithms to operate on color bases中的一个(例如,像素)。 struct random_value是函子类,因为它封装了随机数生成器的数据元素。我只是从GIL的test/core/image/test_fixture.hpp复制了它,但它不一定是一个类。它可以是任何可调用的,可用作函子。 我已经使用gil::名称空间限定条件更新了代码片段,以使事情更清楚地知道。