C++ (C语言)将RGB转换为HSV和HSV转换为RGB的算法,范围为0-255

C++ (C语言)将RGB转换为HSV和HSV转换为RGB的算法,范围为0-255,c++,colors,C++,Colors,我试图使用这个函数来改善HSV到RGB的转换,但是在不使用浮点的情况下有一个小问题 HsvColor hsv; unsigned char rgbMin, rgbMax; rgbMin = rgb.r < rgb.g ? (rgb.r < rgb.b ? rgb.r : rgb.b) : (rgb.g < rgb.b ? rgb.g : rgb.b); rgbMax = rgb.r > rgb.g ? (rgb.r > rgb.b ? rgb.r : rgb.b)

我试图使用这个函数来改善HSV到RGB的转换,但是在不使用浮点的情况下有一个小问题

HsvColor hsv;
unsigned char rgbMin, rgbMax;

rgbMin = rgb.r < rgb.g ? (rgb.r < rgb.b ? rgb.r : rgb.b) : (rgb.g < rgb.b ? rgb.g : rgb.b);
rgbMax = rgb.r > rgb.g ? (rgb.r > rgb.b ? rgb.r : rgb.b) : (rgb.g > rgb.b ? rgb.g : rgb.b);

hsv.v = rgbMax;
if (hsv.v == 0)
{
    hsv.h = 0;
    hsv.s = 0;
    return hsv;
}

hsv.s = 255 * (long int)(rgbMax - rgbMin) / hsv.v;
if (hsv.s == 0)
{
    hsv.h = 0;
    return hsv;
}

if (rgbMax == rgb.r)
    hsv.h = 0 + 43 * (rgb.g - rgb.b) / (rgbMax - rgbMin);
else if (rgbMax == rgb.g)
    hsv.h = 85 + 43 * (rgb.b - rgb.r) / (rgbMax - rgbMin);
else
    hsv.h = 171 + 43 * (rgb.r - rgb.g) / (rgbMax - rgbMin);

return hsv;

我的问题是,我有rgb.b-rgb.r对于小数点后3位的精度,在操作之前,将操作数乘以1000,这样你将有1000*rgb.b-rgb.r<1000而不是rgb.b-rgb.r。你不需要标题中的语言,这就是标记的用途。当标题与您选择的标签不匹配时尤其愚蠢。我猜你已经看过这个问题了,或者你的题目是个巧合。。。你为什么不能用浮球?你们考虑过定点吗?假定.b和.r都是整数,把减法的结果转换成浮点数应该不会有任何区别;所以你的问题似乎不清楚。我不能用float。b和.r是我在一个结构中配置的无符号字符。那么,你的问题是什么?.b和.r是无符号字符,所以如果它们的差异只是rgb.b和rgb.r是无符号字符,因此是整数。对于rgb.b-rgb.r