Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Chương trình C chuyển đổi mô hình màu RGB sang HSV

Cho giá trị màu RGB (0-255), chuyển đổi sang mô hình màu HSV (Hue, Saturation, Value).

Mô hình RGB

Gồm 3 màu: Đỏ (Red), Xanh lá (Green), Xanh dương (Blue). Mô hình cộng tính, dùng trong màn hình hiển thị.

Mô hình HSV

Gồm: Sắc độ (Hue), Độ bão hòa (Saturation), Giá trị (Value). Phù hợp với cách con người cảm nhận màu, dùng nhiều trong thiết kế.

Thuật toán chuyển đổi

  1. Chuẩn hóa R,G,B về [0,1] bằng cách chia 255.
  2. Tìm cmax (max), cmin (min), diff = cmax - cmin.
  3. Tính Hue (h):
    • Nếu cmax == cmin: h = 0
    • Nếu cmax == r: h = (60 * ((g-b)/diff) + 360) % 360
    • Nếu cmax == g: h = (60 * ((b-r)/diff) + 120) % 360
    • Nếu cmax == b: h = (60 * ((r-g)/diff) + 240) % 360
  4. Tính Saturation (s):
    • Nếu cmax == 0: s = 0
    • Khác: s = (diff / cmax) * 100
  5. Tính Value (v): v = cmax * 100

Mã nguồn C

#include <stdio.h>
#include <math.h>

float max(float a, float b, float c) {
    return (a > b) ? (a > c ? a : c) : (b > c ? b : c);
}
float min(float a, float b, float c) {
    return (a < b) ? (a < c ? a : c) : (b < c ? b : c);
}

int rgb_to_hsv(float r, float g, float b) {
    float h, s, v;
    r /= 255.0; g /= 255.0; b /= 255.0;
    float cmax = max(r, g, b);
    float cmin = min(r, g, b);
    float diff = cmax - cmin;

    if (cmax == cmin) h = 0;
    else if (cmax == r) h = fmod((60 * ((g - b) / diff) + 360), 360.0);
    else if (cmax == g) h = fmod((60 * ((b - r) / diff) + 120), 360.0);
    else if (cmax == b) h = fmod((60 * ((r - g) / diff) + 240), 360.0);

    if (cmax == 0) s = 0;
    else s = (diff / cmax) * 100;

    v = cmax * 100;
    printf("h s v = (%f, %f, %f)\n", h, s, v);
    return 0;
}

int main() {
    int r = 45, g = 215, b = 0;
    rgb_to_hsv(r, g, b);
    return 0;
}

Kết quả

h s v = (107.441864, 100.000000, 84.313728)