tot*_*two 16 c++ boost boost-gil
尝试按照GIL的设计指南工作,我bits__用于我的频道数据类型.我经常将外部数据包装到GIL图像视图中.但是,即使使用bits__数据指针的类型,我也必须在我创建图像视图之前添加reinterpret_cast.请使用以下代码
int width = 3;
int height = 2;
boost::gil::bits8 data8[] = {0, 1, 100, 200, 50, 51};
boost::gil::bits8* pBits8 = data8;
boost::gil::gray8_ptr_t pGray8 = pBits8;
boost::gil::gray8_view_t v = interleaved_view(width, height, pGray8, width * sizeof(boost::gil::bits8));
Run Code Online (Sandbox Code Playgroud)
导致第6行的错误"错误C2440:'初始化':无法从'boost :: gil :: bits8*'转换为'boost :: gil :: gray8_ptr_t'1>指向的类型不相关;转换需要reinterpret_cast, C风格演员或功能风格演员阵容"
尽可能多地深入研究源代码,看起来这些类型确实是未发布的.bits8只是unsigned char,但是gray8_ptr_t指向a的指针struct pixel<bits8,gray_layout_t>.这个结构的唯一元素是单个bit8,因此reinterpret_cast看起来很安全.它也适用于我抛出的测试.
但是,我经常将外部数据包装到图像视图中,并且在每个地方都进行reinterpret_cast会产生问题.有没有更安全的方法来构建用于GIL的像素指针?
目前的解决方法:
template<class Dest, class Src>
Dest gil_safe_ptr_cast(Src src)
{
// this cast is unsafe, use reinterpret_cast
BOOST_STATIC_ASSERT(false);
}
template<> boost::gil::gray8_ptr_t gil_safe_ptr_cast(boost::gil::bits8* pBits8)
{
return reinterpret_cast<boost::gil::gray8_ptr_t>(pBits8);
}
boost::gil::bits8* pBits8 = data8;
boost::gil::gray8_ptr_t pGray8 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits8); // works
boost::gil::bits16* pBits16 = NULL;
boost::gil::gray8_ptr_t pGray82 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits16); // compile error as expected
Run Code Online (Sandbox Code Playgroud)
template<class Dest, class Src>
Dest gil_safe_ptr_cast(Src src)
{
// this cast is unsafe, use reinterpret_cast
BOOST_STATIC_ASSERT(false);
}
template<> boost::gil::gray8_ptr_t gil_safe_ptr_cast(boost::gil::bits8* pBits8)
{
return reinterpret_cast<boost::gil::gray8_ptr_t>(pBits8);
}
boost::gil::bits8* pBits8 = data8;
boost::gil::gray8_ptr_t pGray8 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits8); // works
boost::gil::bits16* pBits16 = NULL;
boost::gil::gray8_ptr_t pGray82 = gil_safe_ptr_cast<boost::gil::gray8_ptr_t>(pBits16); // compile error as expected
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
580 次 |
| 最近记录: |