将颜色值从float转换为byte的正确方法是什么?起初我以为b = f * 255.0应该这样做,但现在我想,在这种情况下,只有精确的1.0将被转换为255,但0.9999已经是254,这可能不是我想要的……
似乎b = f * 256.0会更好,除非它会在精确1.0的情况下产生256的不需要的情况.
最后我用这个:
#define F2B(f) ((f) >= 1.0 ? 255 : (int)((f)*256.0))
解决方法
1.0是唯一可能出错的情况,所以单独处理该案例:
b = floor(f >= 1.0 ? 255 : f * 256.0)
此外,值得强制的是,f确实为0 <= f <= 1以避免由于舍入误差导致的不正确行为(例如,f = 1.0000001).
f2 = max(0.0,min(1.0,f)) b = floor(f2 == 1.0 ? 255 : f2 * 256.0)
替代安全解决方案
b = (f >= 1.0 ? 255 : (f <= 0.0 ? 0 : (int)floor(f * 256.0)))
要么
b = max(0,min(255,(int)floor(f * 256.0)))