boost :: gil的数字扩展包含如下算法:
template <typename Channel1,typename Channel2,typename ChannelR>
struct channel_plus_t : public std::binary_function<Channel1,Channel2,ChannelR> {
ChannelR operator()(typename channel_traits<Channel1>::const_reference ch1,
typename channel_traits<Channel2>::const_reference ch2) const {
return ChannelR(ch1)+ChannelR(ch2);
}
};
当填充两个uint8通道值时,如果ChannelR也是uint8,则会发生溢出。
我认为计算应该
boost::gil::channel_traits<ChannelR>::min_value()
/ ... max_value()
?)如何以允许性能优化结果的方式执行此操作?
答案 0 :(得分:0)
我不明白这里的问题是什么......我的反应是“所以如果那会破坏,不要将ChannelR设置为uint8”
你似乎在做与
这样的代码争论相当的事情 uint8 a=128;
uint8 b=128;
uint8 c=a+b; // Uh-Oh...
应该做一些聪明的事情(例如饱和算术)。
我建议解决方案是使用更高的精度,或者使用您需要的行为定义自己的channel_saturating_plus_t
,就像我建议的解决方案一样
uint16 c=uint16(a)+uint16(b)
或
uint8 c=saturating_add(a,b);
感谢GIL的创建者甚至考虑将结果类型公开为单独的类型参数;那里有大量的库不会!