如何使用 GIL 迭代器设置像素
How to set a pixel using GIL iterators
正在尝试学习一些 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 值?
简单地说,使用所需的通道值创建 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_generate
是 GIL algorithms to operate on color bases (e.g. pixels). The struct random_value
is a functor class because it encapsulates data elements of the random number generator. I simply copied it form GIL's test/core/image/test_fixture.hpp 之一,但不一定是 class。它可以是任何可调用的,可用作函子的东西。
我已经用 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 值?
简单地说,使用所需的通道值创建 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_generate
是 GIL algorithms to operate on color bases (e.g. pixels). The struct random_value
is a functor class because it encapsulates data elements of the random number generator. I simply copied it form GIL's test/core/image/test_fixture.hpp 之一,但不一定是 class。它可以是任何可调用的,可用作函子的东西。
我已经用 gil::
命名空间限定更新了代码片段,以使其更清楚事物的来源。