如何使用 boost::gil 将 gray8_view_t 转换为 rgb8_view_t 并从中创建 rgb8_image_t 对象?
How to convert a gray8_view_t to a rgb8_view_t by using boost::gil and create a rgb8_image_t object from it?
因为boost::gil不支持gray8_view_t写BMP格式,所以想把gray8_view_t转成rgb8_view_t。这是我到目前为止尝试过的方法。
auto rgb_view = boost::gil::planar_rgb_view(width, height, pixels, pixels, pixels, width);
pixels 包含来自 gray8_view_t 对象的原始像素,所以我让 r=g=b=pixels。但是 boost::gil::write_view(ofstream, rgb_view, boost::gil::bmp_tag())
给了我一个空图像。有什么想法吗?
更新:
通过使用 sehe 的示例代码 http://coliru.stacked-crooked.com/a/daa0735f774b727f,我能够使用 color_converted_view<gil::rgb8_view_t>
编译颜色对话。但是当我使用 boost::gil::write_view
从 color_converted_view<gil::rgb8_view_t>
的 return 值创建图像文件时,它不会编译。我的猜测是我将不得不从 return 值创建一个实际的 rgb8_image_t 对象。如何将 color_converted_view<gil::rgb8_view_t>
的 return 值转换为实际的 rgb8_image_t 对象?谢谢!
#include <boost/gil.hpp>
#include <fstream>
namespace gil = boost::gil;
int main()
{
std::ifstream in("gray8_image_t_sample.jpg", std::ios::binary);
gil::gray8_image_t img;
gil::read_image(in, img, gil::jpeg_tag());
gil::gray8_view_t gv = gil::view(img);
std::ofstream ofs1("test_image.png", std::ios::out | std::ios_base::binary);
gil::write_view(ofs1, gv, gil::png_tag()); // This works
auto rgbv = gil::color_converted_view<gil::rgb8_view_t>(gv);
std::ofstream ofs2("test_image.bmp", std::ios::out | std::ios_base::binary);
gil::write_view(ofs2, rgbv, gil::bmp_tag()); // this does not compile
}
我收到的错误消息之一
\boost\gil\color_base_algorithm.hpp(170,76): error G1A4676F8: no member named 'layout_t' in 'boost::gil::image<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mp11::mp_list<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t>, boost::mp11::mp_list<std::integral_constant<int, 0>, std::integral_constant<int, 1>, std::integral_constant<int, 2>>>>, false, std::allocator<unsigned char>>' [clang-diagnostic-error]
Here is the gray8_image_t file I'm using
好的,剩下的问题只是模板参数指定错误,color_converted_view
需要目标像素类型:
#include <boost/gil.hpp>
#include <boost/gil/extension/io/bmp.hpp>
#include <boost/gil/extension/io/jpeg.hpp>
#include <boost/gil/extension/io/png.hpp>
#include <fstream>
namespace gil = boost::gil;
int main()
{
std::ifstream in("gray8_image_t_sample.jpg", std::ios::binary);
gil::gray8_image_t img;
gil::read_image(in, img, gil::jpeg_tag());
gil::gray8_view_t gv = gil::view(img);
gil::write_view("input.png", gv, gil::png_tag());
auto rgbv = gil::color_converted_view<gil::rgb8_pixel_t>(gv);
gil::write_view("output.png", rgbv, gil::png_tag());
gil::write_view("output.bmp", rgbv, gil::bmp_tag());
}
生成文件:
name
preview
input.png
output.png
output.bmp
因为boost::gil不支持gray8_view_t写BMP格式,所以想把gray8_view_t转成rgb8_view_t。这是我到目前为止尝试过的方法。
auto rgb_view = boost::gil::planar_rgb_view(width, height, pixels, pixels, pixels, width);
pixels 包含来自 gray8_view_t 对象的原始像素,所以我让 r=g=b=pixels。但是 boost::gil::write_view(ofstream, rgb_view, boost::gil::bmp_tag())
给了我一个空图像。有什么想法吗?
更新:
通过使用 sehe 的示例代码 http://coliru.stacked-crooked.com/a/daa0735f774b727f,我能够使用 color_converted_view<gil::rgb8_view_t>
编译颜色对话。但是当我使用 boost::gil::write_view
从 color_converted_view<gil::rgb8_view_t>
的 return 值创建图像文件时,它不会编译。我的猜测是我将不得不从 return 值创建一个实际的 rgb8_image_t 对象。如何将 color_converted_view<gil::rgb8_view_t>
的 return 值转换为实际的 rgb8_image_t 对象?谢谢!
#include <boost/gil.hpp>
#include <fstream>
namespace gil = boost::gil;
int main()
{
std::ifstream in("gray8_image_t_sample.jpg", std::ios::binary);
gil::gray8_image_t img;
gil::read_image(in, img, gil::jpeg_tag());
gil::gray8_view_t gv = gil::view(img);
std::ofstream ofs1("test_image.png", std::ios::out | std::ios_base::binary);
gil::write_view(ofs1, gv, gil::png_tag()); // This works
auto rgbv = gil::color_converted_view<gil::rgb8_view_t>(gv);
std::ofstream ofs2("test_image.bmp", std::ios::out | std::ios_base::binary);
gil::write_view(ofs2, rgbv, gil::bmp_tag()); // this does not compile
}
我收到的错误消息之一
\boost\gil\color_base_algorithm.hpp(170,76): error G1A4676F8: no member named 'layout_t' in 'boost::gil::image<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mp11::mp_list<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t>, boost::mp11::mp_list<std::integral_constant<int, 0>, std::integral_constant<int, 1>, std::integral_constant<int, 2>>>>, false, std::allocator<unsigned char>>' [clang-diagnostic-error]
Here is the gray8_image_t file I'm using
好的,剩下的问题只是模板参数指定错误,color_converted_view
需要目标像素类型:
#include <boost/gil.hpp>
#include <boost/gil/extension/io/bmp.hpp>
#include <boost/gil/extension/io/jpeg.hpp>
#include <boost/gil/extension/io/png.hpp>
#include <fstream>
namespace gil = boost::gil;
int main()
{
std::ifstream in("gray8_image_t_sample.jpg", std::ios::binary);
gil::gray8_image_t img;
gil::read_image(in, img, gil::jpeg_tag());
gil::gray8_view_t gv = gil::view(img);
gil::write_view("input.png", gv, gil::png_tag());
auto rgbv = gil::color_converted_view<gil::rgb8_pixel_t>(gv);
gil::write_view("output.png", rgbv, gil::png_tag());
gil::write_view("output.bmp", rgbv, gil::bmp_tag());
}
生成文件:
name | preview |
---|---|
input.png | |
output.png | |
output.bmp |