**RGB565 转 HSV C语言实现**
/**
* @brief RGB 转 HSV
* @param [IN] rgb565
* @param [OUT] *H 分量 范围 0 ~ 360°
* @param [OUT] *S 分量 范围 0 ~ 100
* @param [OUT] *V 分量 范围 0 ~ 252
*/
void Img_Rgb565ToHSV(uint16_t *uspRgb565, int16_t *H, int16_t *S, int16_t *V)
{
uint16_t usMax, usMin, usDx;
uint16_t usR, usG, usB;
uint16_t *uspRgb = uspRgb565;
usR = (uint8_t)((*uspRgb & 0xF800) >> 8); /* 提取R通道 */
usG = (uint8_t)((*uspRgb & 0x7E0) >> 3); /* 提取G通道 */
usB = (uint8_t)((*uspRgb & 0x001F) << 3); /* 提取B通道 */
usMax = ((usR > usG) ? usR : usG);
if(usB > usMax)
{
usMax = usB;
}
usMin = ((usR < usG) ? usR : usG);
if(usB < usMin)
{
usMin = usB;
}
usDx = usMax - usMin;
if(usDx != 0)
{
/* H */
if(usR == usMax)
{
*H = 60 * (usG - usB) / usDx;
}
else if(usG == usMax)
{
*H = 60 * (usB - usR) / usDx + 120;
}
else
{
*H = 60 * (usR - usG) / usDx + 240;
}
if(*H < 0)
{
*H += 360;
}
/* S */
*S = (usDx * 100) / usMax;
}else
{
/* H */
*H = 0;
/* S */
*S = 0;
}
/* V */
*V = usMax;
}