我试图按照 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));
在第6行出现错误,提示“error C2440: 'initializing' : cannot convert from 'boost::gil::bits8 *' to 'boost::gil::gray8_ptr_t' 1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast”。
尽可能深入源代码后,看起来这些类型确实是不相关的。bits8只是unsigned char
,但是gray8_ptr_t
是指向struct pixel<bits8,gray_layout_t>
的指针。此结构体的唯一元素是一个bits8,因此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