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