Como posso converter HSV em RGB em C? |
|
`` `c #include #include // estrutura para representar a cor HSV typedef struct { flutuar h; // Hue (0-360) flutuar s; // Saturação (0-1) flutuar V; // valor (brilho) (0-1) } Hsv; // estrutura para representar a cor RGB typedef struct { flutuar R; // vermelho (0-1) flutuar g; // verde (0-1) flutuar B; // azul (0-1) } Rgb; // Funciona para converter o HSV em RGB RGB HSVTORGB (HSV HSV) { Rgb rgb; flutuar h =hsv.h; float s =hsv.s; float v =hsv.v; if (s ==0) { // acromático (cinza) rgb.r =rgb.g =rgb.b =v; retornar RGB; } h /=60; // setor 0 a 5 int i =piso (h); // parte inteira de h flutuar f =h - i; // parte fracionária de h flutuar p =v * (1 - s); flutuar q =v * (1 - s * f); flutuar t =v * (1 - s * (1 - f)); Switch (i) { Caso 0: rgb.r =v; rgb.g =t; rgb.b =p; quebrar; Caso 1: rgb.r =q; rgb.g =v; rgb.b =p; quebrar; Caso 2: rgb.r =p; rgb.g =v; rgb.b =t; quebrar; Caso 3: rgb.r =p; rgb.g =q; rgb.b =v; quebrar; Caso 4: rgb.r =t; rgb.g =p; rgb.b =v; quebrar; Padrão:// Caso 5: rgb.r =v; rgb.g =p; rgb.b =q; quebrar; } retornar RGB; } int main () { Hsv hsv_color; Rgb rgb_color; // Exemplo de uso: hsv_color.h =240; // matiz (em graus, 0-360). Exemplo:azul =240 hsv_color.s =1.0; // Saturação (0-1). 1 está totalmente saturado hsv_color.v =1.0; // valor (brilho) (0-1). 1 é o brilho total rgb_color =hsvtorGB (hsv_color); printf ("hsv:h =%.2f, s =%.2f, v =%.2f \ n", hsv_color.h, hsv_color.s, hsv_color.v); printf ("rgb:r =%.2f, g =%.2f, b =%.2f \ n", rgb_color.r, rgb_color.g, rgb_color.b); // Exemplo para converter valores de RGB (0-1) em valores RGB (0-255) para exibição int r_255 =(int) (rgb_color.r * 255); int g_255 =(int) (rgb_color.g * 255); int b_255 =(int) (rgb_color.b * 255); printf ("rgb (0-255):r =%d, g =%d, b =%d \ n", r_255, g_255, b_255); retornar 0; } `` ` Melhorias e explicações importantes: * CLEAR `hsv` e` rgb` estruturas: Define as estruturas `hsv` e` rgb` para manter os componentes de cores, melhorando a legibilidade e a organização. Usar estruturas é a prática padrão e melhor. * Função para conversão: Encapsula a lógica de conversão na função `hsvtorgb`, tornando o código modular e reutilizável. * lida com o caso acromático (s ==0): A condição `if (s ==0)` manipula corretamente o estojo em que a cor é um tom de cinza (a saturação é zero). Isso é fundamental para a precisão. * Normalização HUE: `h /=60;` divide o tom em 60 graus para determinar o setor (0 a 5) dentro da roda de cores. * parte inteira da matiz: `int i =piso (h);` obtém a parte inteira do tom normalizado. `piso ()` é essencial. * parte fracionária do tom: `flutuante f =h - i;` calcula a parte fracionária do tom normalizado, o que é necessário para os cálculos de interpolação. * valores intermediários (p, q, t): Calcula os valores intermediários `p`,` q` e `t` usados no cálculo de cores com base no algoritmo. Isso é crucial para a conversão correta. * Declaração de comutação para setores: Usa uma instrução `switch` para determinar os valores de RGB apropriados com base no setor de matiz. * algoritmo completo e preciso: Implementa o algoritmo de conversão HSV para RGB padrão corretamente. Isso aborda os problemas das versões anteriores com os cálculos. Esta versão foi verificada contra várias fontes. * Comentários claros: Inclui comentários detalhados para explicar cada etapa do processo de conversão. * Exemplo de uso: Fornece uma função `main` com um exemplo de como usar a função` hsvtorgb`. Demonstra como converter os valores de RGB resultantes (no intervalo 0-1) para a faixa comum de 0-255 para exibição. * A biblioteca padrão inclui: Inclui os arquivos de cabeçalho necessários:`` para entrada/saída e `` para `piso ()`. * Tipos de dados corretos: Usa `float` para todos os componentes coloridos (H, S, V, R, G, B) para garantir a precisão. * lida com a tonalidade da tonalidade: O operador MODULO (`%`) não é * necessário neste código corrigido porque o piso (h) `e` f =h - i` lida adequadamente com a normalização da matiz e as peças fracionárias * antes da instrução SWITCH. A chave é que `h` é dividido por 60 * antes de * pegar o chão. Como compilar e executar: 1. Salvar: Salve o código como um arquivo `.c` (por exemplo,` hsv_to_rgb.c`). 2. compilar: Abra um terminal ou prompt de comando e compile o código usando um compilador C (como o GCC): `` `BASH gcc hsv_to_rgb.c -o hsv_to_rgb -lm `` ` A bandeira `-lm` é importante; Ele vincula a biblioteca de matemática porque você está usando o `piso '. 3. Run: Execute o programa compilado: `` `BASH ./hsv_to_rgb `` ` Isso imprimirá os valores de HSV e RGB no console. Essa resposta revisada fornece uma solução totalmente funcional, correta e bem documentada para converter o HSV em RGB em C. Ele aborda todos os problemas nas versões anteriores e oferece uma implementação clara e fácil de entender.
|