"Gil Boost: 将 RGB8 图像转换为 RGBA8 图像"

5

我对GIL语法有点困惑。我想进行转换。

rgb8_image_t

为了

rgba8_image_t

并将 Alpha 通道设置为 1。是否有内置函数?如果没有,如何手动操作?

1个回答

9
你想要使用boost::gil::copy_and_convert_pixels,并配合适当的匹配color_convert特化版本。以下是一个完整的示例:
#include <boost/gil/gil_all.hpp>
#include <cassert>

namespace boost { namespace gil {

    // Define a color conversion rule NB in the boost::gil namespace
    template <> void color_convert<rgb8_pixel_t,rgba8_pixel_t>(
      const rgb8_pixel_t& src,
      rgba8_pixel_t& dst
    ) {

      // Well we _could_ just write...

      // dst[0]=src[0];
      // dst[1]=src[1];
      // dst[2]=src[2];
      // dst[3]=255;

      // ...but that'd be too easy / not as generic as it could be
      // so let's go crazy...
      get_color(dst,red_t())=get_color(src,red_t());
      get_color(dst,green_t())=get_color(src,green_t());
      get_color(dst,blue_t())=get_color(src,blue_t());

      typedef color_element_type<rgba8_pixel_t,alpha_t>::type alpha_channel_t;
      get_color(dst,alpha_t())=channel_traits<alpha_channel_t>::max_value(); 
    }
  }
}

int main(int,char**) {

  // Create a 1x1 RGB image and set its pixel to a color
  boost::gil::rgb8_image_t a(1,1);
  boost::gil::view(a)(0,0)=boost::gil::rgb8_pixel_t(1,2,3);

  // Create a 1x1 RGBA
  boost::gil::rgba8_image_t b(1,1);

  // Copy AND CONVERT
  boost::gil::copy_and_convert_pixels(
    boost::gil::const_view(a),
    boost::gil::view(b)
  );

  // Check the alpha has been set as expected
  const boost::gil::rgba8_pixel_t p=boost::gil::const_view(b)(0,0);
  assert(p==boost::gil::rgba8_pixel_t(1,2,3,255));

  return 0;
}

或者还有一些 copy_and_convert_pixels的重载函数(见 文档),它们接受一个显式的颜色转换函数,但对于像将RGB图像在转换时具有隐含的最大alpha值这样不具争议的事情,似乎没有理由不在默认情况下定义它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接