You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用boost::gil将gray8_view_t转rgb8_view_t并生成rgb8_image_t对象

问题解决方法

报错根因

你调用color_converted_view时传入的模板参数错误:该接口要求传入目标像素类型,你错误传入了视图类型gil::rgb8_view_t,类型不匹配触发了编译报错。

解决方法

方案1:直接修正转换代码(无需额外构造图像对象)

仅需要修改color_converted_view的模板参数为gil::rgb8_pixel_t,即可直接写入BMP文件,无需显式生成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()); // 可正常运行

        // 仅修改此处模板参数为目标像素类型rgb8_pixel_t即可
        auto rgbv = gil::color_converted_view<gil::rgb8_pixel_t>(gv);
        std::ofstream ofs2("test_image.bmp", std::ios::out | std::ios_base::binary);
        gil::write_view(ofs2, rgbv, gil::bmp_tag()); // 可正常编译运行
} 

方案2:显式转换为rgb8_image_t对象

如果你的业务场景需要持有实际的RGB图像对象做后续处理,直接用转换后的视图构造rgb8_image_t即可:

// 先做颜色转换得到临时视图
auto converted_rgb_view = gil::color_converted_view<gil::rgb8_pixel_t>(gv);
// 用视图直接构造RGB图像对象
gil::rgb8_image_t rgb_img(converted_rgb_view);
// 后续使用时取视图即可
std::ofstream ofs2("test_image.bmp", std::ios::out | std::ios_base::binary);
gil::write_view(ofs2, gil::view(rgb_img), gil::bmp_tag());

补充说明

你最开始用planar_rgb_view输出空图像的原因是:BMP格式原生支持的是交错(非平面)布局的RGB像素存储,你构造的平面RGB视图内存布局和BMP要求的布局不匹配,所以输出结果为空。

内容的提问来源于stack exchange,提问作者BunRieuCua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:54:04