English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Programma C per convertire il modello di colore RGB in HSV

Dato l'intervallo di colori RGB (in forma intera); la任务是 trovare il range di colori HSV appropriato attraverso la trasformazione dell'intervallo di colori RGB

Cos'è il modello di colore RGB?

Il modello di colore RGB è composto da rosso, verde e blu. Il modello RGB è un modello di colore ampiamente utilizzato nelle tecnologie di visualizzazione. È un modello cumulativo, in cui sommiamo questi tre colori di intensità diverse per produrre milioni di colori diversi sui dispositivi di visualizzazione.

Cos'è il modello di colore HSV?

Il modello di colore HSV include tonalità, saturazione, valore, noto anche come HSB (tonalità, saturazione, luminosità). Il HSV è un'alternativa al modello di colore RGB. È stato adattato in base alla percezione del colore visivo umano. Grazie al suo schema di colorazione naturale, questo modello di colore è spesso utilizzato dagli artisti. Le tre proprietà di HSV possono essere sommate o sottratte.

Dobbiamo fare nel programma

Dobbiamo ottenere l'input dall'utente dei valori del modello RGB e poi calcolare l'output del modello di colore HSV in modo matematico.

示例

Input: r = 31, g = 52, b = 29
Output: h s v = (114.782608, 44.230770, 20.392157)
Input: r = 129, g = 88, b = 47
Output: h s v = (30.000000, 63.565895, 50.588238)

Il metodo che useremo per risolvere il problema dato -

  • Inserisci con i tre colori rosso (r), verde (g) e blu (b).

  • Dividi tutti i valori di colore per 255.

  • Ora calcola cmax, cmin e la differenza.

  • Controlla -

    • Se cmax e cmin sono uguali a 0, il tono di colore o h sarà 0.

    • Se cmax è uguale a Red(r), il tono di colore (h) = (60 * ((g – b) / diff) + 360) % 360.

    • Se cmax è uguale a Green(g), il tono di colore (h) = (60 * ((b – r) / diff) + 120) % 360.

    • Se cmax è uguale a Blue(b), il tono di colore (h) = (60 * ((r – g) / diff) + 240) % 360.

  • Per trovare la saturazione, esamineremo -

    • Se cmax = 0, la saturazione (s) = 0.

    • Se cmax non è uguale a zero, la saturazione (s) = (diff / cmax) * 100

  • Calcolo del valore -

    • Il valore (v) = cmax * 100

Algoritmo

Inizia
Passo 1 -> Nella funzione float max(float a, float b, float c)
   Restituisci (a > b) ? (a > c ? a : c) : (b > c ? b : c)
Passo 2 -> Nella funzione float min(float a, float b, float c)
   Restituisci (a < b) ? (a < c ? a : c) : (b < c ? b : c)
Passo 3 -> Nella funzione int rgb_to_hsv(float r, float g, float b)
   Dichiarare float h, s, v
      Set r = r / 255.0
      Set g = g / 255.0
      Set b = b / 255.0
      Set cmax = max(r, g, b)
      Set cmin = min(r, g, b)
      Set diff = cmax - cmin
      If cmax == cmin then,
         Set h = 0
      End if
      Else if cmax == r then,
         Set h = fmod((60 * ((g - b) / diff) + 360), 360.0)
      End Else if
      Else if cmax == g then,
         Set h = fmod((60 * ((b - r) / diff) + 120), 360.0)
      End Else if
      Else if cmax == b then,
         Set h = fmod((60 * ((r - g) / diff) + 240), 360.0)
      End Else if
         If cmax == 0 then,
         Set s = 0
      End if
      Else
         Set s = (diff / cmax) * 100
      End Else
      v = cmax * 100;
      Print h, s, v
      Step 4 -> int main(int argc, char const *argv[])
      Declare and initialize r = 45, g = 215, b = 0
      Call function rgb_to_hsv(r, g, b)
Stop

示例

#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) {
   //R,G,B值除以255-
   //将范围从0..255更改为0..1:
   float h, s, v;
   r /= 255.0;
   g /= 255.0;
   b /= 255.0;
   float cmax = max(r, g, b); // maximum of r, g, b
   float cmin = min(r, g, b); // minimum of r, g, b
   float diff = cmax-cmin; // diff of cmax and 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);
   //Se cmax è uguale a zero
      if (cmax == 0)
         s = 0;
      else
         s = (diff / cmax) * 100;
   //Calcolo v-
   v = cmax * 100;
   printf("h s v=(%f, %f, %f)\n", h, s, v );
   return 0;
}
//Funzione principale
int main(int argc, char const *argv[]) {
   int r = 45, g = 215, b = 0;
   rgb_to_hsv(r, g, b);
   return 0;
}

Risultato di output

h s v=(107.441864, 100.000000, 84.313728)