使用 boost.gil 逐像素读取.png文件

Reading .png files pixel-by-pixel using boost.gil

本文关键字:读取 png 文件 像素 boost gil 使用      更新时间:2023-10-16

我尝试使用"Boost.GIL"中的以下代码将图像转换为"原始"字节,以将png文件转换为原始位(后来被OpenGL使用),

包括:

#include <boost/gil/gil_all.hpp>
#include <boost/gil/extension/io/png_io.hpp>
#include <boost/gil/extension/io/png_dynamic_io.hpp>

内部功能:

boost::gil::rgba8_image_t image;
png_read_and_convert_image(path, image);
unsigned char* data = new unsigned char[image.width() * image.height() *
    boost::gil::num_channels<boost::gil::rgba8_pixel_t>()];
std::size_t i = 0;
auto lambda = [data, &i](boost::gil::rgba8_pixel_t p)
    {
        data[i] = boost::gil::at_c<0>(p); ++i;
        data[i] = boost::gil::at_c<1>(p); ++i;
        data[i] = boost::gil::at_c<2>(p); ++i;
        data[i] = boost::gil::at_c<3>(p); ++i;
    };
boost::gil::for_each_pixel(image._view,    std::function<void(boost::gil::rgba8_pixel_t)>(lambda));

给出std::string path的地方。但这不能编译。( int_p_NULLpng_io_private.hpp 中未声明的标识符)。我还尝试用以下内容替换for_each_pixel

for (int x = 0; x < image.width(); ++x)
{
    boost::gil::rgba8_view_t::y_iterator it = image._view.col_begin(x);
    for (int y = 0; y < image.height(); ++y)
    {
        data[i] = boost::gil::at_c<0>(it[y]); ++i;
        data[i] = boost::gil::at_c<1>(it[y]); ++i;
        data[i] = boost::gil::at_c<2>(it[y]); ++i;
        data[i] = boost::gil::at_c<3>(it[y]); ++i;
    }
}

此代码也不会编译并给出相同的错误。我应该怎么做才能正确读取.png图像?

编辑:@cv_and_he指出lambdas不能自然地与boost.gil一起工作。我已经修改了第一段代码,它现在给出了与第二段代码相同的错误。

int_p_NULL在

libpng-1.2.x/png.h中定义;请确保直接或间接包含png.h,并且没有使用较新版本的libpng。