我尝试使用Using Boost.GIL to convert an image into “raw” bytes中的以下代码将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_NULL
:png_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指出lambda不能自然地与boost.gil一起工作。我修改了第一段代码,它现在给出了与第二段相同的错误。
答案 0 :(得分:2)
int_p_NULL在libpng-1.2.x / png.h中定义;确保你直接或间接地包含了png.h,并且你没有使用更新版本的libpng。