RGB565 转 HSV C语言实现

								**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;
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言中,可以通过以下步骤来读取 RGB 图片并换为 HSV: 1. 使用标准库中的文件操作函数打开图片文件,并读取文件头信息和像素数据。 2. 遍历每个像素点,将 RGB换为 HSV 值。 3. 将换后的 HSV 值写回到原始像素数据中。 4. 将修改后的像素数据写入新文件保存。 下面是一个简单的示例代码,仅供参考: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct { unsigned char r, g, b; } pixel; void rgb2hsv(pixel *p) { float r = p->r / 255.0f; float g = p->g / 255.0f; float b = p->b / 255.0f; float cmax = fmaxf(r, fmaxf(g, b)); float cmin = fminf(r, fminf(g, b)); float delta = cmax - cmin; float h = 0.0f, s = 0.0f, v = cmax; if (delta > 0) { if (cmax == r) { h = 60.0f * fmodf((g - b) / delta, 6.0f); } else if (cmax == g) { h = 60.0f * ((b - r) / delta + 2.0f); } else if (cmax == b) { h = 60.0f * ((r - g) / delta + 4.0f); } s = delta / cmax; } p->r = h / 360.0f * 255.0f; p->g = s * 255.0f; p->b = v * 255.0f; } int main(int argc, char **argv) { if (argc != 3) { printf("Usage: %s <input_file> <output_file>\n", argv[0]); return 1; } FILE *fin = fopen(argv[1], "rb"); if (!fin) { printf("Failed to open input file.\n"); return 1; } fseek(fin, 0, SEEK_END); long size = ftell(fin); fseek(fin, 0, SEEK_SET); unsigned char *data = malloc(size); if (!data) { printf("Failed to allocate memory.\n"); fclose(fin); return 1; } fread(data, 1, size, fin); fclose(fin); int width = *(int *)&data[18]; int height = *(int *)&data[22]; int bpp = *(short *)&data[28]; if (bpp != 24) { printf("Only support 24-bit RGB images.\n"); free(data); return 1; } int offset = *(int *)&data[10]; int row_size = (width * 3 + 3) / 4 * 4; pixel *pixels = malloc(width * height * sizeof(pixel)); if (!pixels) { printf("Failed to allocate memory.\n"); free(data); return 1; } for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int i = y * row_size + x * 3; pixels[y * width + x].r = data[offset + i + 2]; pixels[y * width + x].g = data[offset + i + 1]; pixels[y * width + x].b = data[offset + i]; rgb2hsv(&pixels[y * width + x]); } } FILE *fout = fopen(argv[2], "wb"); if (!fout) { printf("Failed to open output file.\n"); free(data); free(pixels); return 1; } fwrite(data, 1, offset, fout); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int i = y * row_size + x * 3; data[offset + i + 2] = pixels[y * width + x].r; data[offset + i + 1] = pixels[y * width + x].g; data[offset + i] = pixels[y * width + x].b; } } fwrite(data + offset, 1, size - offset, fout); fclose(fout); free(data); free(pixels); return 0; } ``` 注意,这只是一个简单的示例代码,并没有进行错误处理和异常情况的处理,实际使用时应该根据需要进行相应的改进和优化。另外,本示例代码只支持 24 位 RGB 图片,其他格式的图片需要进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值