English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Дан диапазон цветов RGB (в виде целых чисел); задачей является нахождение подходящего диапазона цветов HSV через преобразование диапазона цветов RGB
Модель цвета RGB состоит из красного, зеленого и синего цветов. Модель RGB является широко используемой моделью цвета в технологии отображения. Это накопительная модель, в которой мы добавляем эти три цвета с различной интенсивностью, чтобы на дисплее устройства образовалось миллионы различных цветов.
Модель цвета HSV включает в себя тон, насыщенность и значение, также известную как HSB (тон, насыщенность,亮度). Модель HSV является заменителем модели цвета RGB. Она адаптирована в соответствии с восприятием цвета человеческим зрением. Из-за своей естественной схемы配色, эта модель цвета часто используется художниками. Три属性 HSV могут быть добавлены или вычтены.
We must get the input from the user of the RGB model values and then calculate the output in the HSV color model in a mathematical way.
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)
We will use the method to solve the given problem-
Input in red(r), green(g) and blue(b) three colors.
Divide all color values by 255.
Now calculate cmax, cmin and difference.
Check-
If cmax and cmin are equal to 0, then hue or h will be 0.
If cmax equals Red(r), then hue(h) = (60 * ((g – b) / diff) + 360) % 360.
If cmax equals Green(g), then hue(h) = (60 * ((b – r) / diff) + 120) % 360.
If cmax equals Blue(b), then hue(h) = (60 * ((r – g) / diff) + 240) % 360.
To find the saturation, we will check-
If cmax = 0, then saturation(s) = 0.
If cmax is not equal to zero, then saturation(s) = (diff / cmax) * 100
Value calculation-
Value(v) = cmax * 100
Start Step 1 -> In function float max(float a, float b, float c) Return (a > b) ? (a > c ? a : c) : (b > c ? b : c) Step 2 -> In function float min(float a, float b, float c) Return (a < b) ? (a < c ? a : c) : (b < c ? b : c) Step 3 -> In function int rgb_to_hsv(float r, float g, float b) Declare float h, s, v Установить r = r / 255.0 Установить g = g / 255.0 Установить b = b / 255.0 Установить cmax = max(r, g, b) Установить cmin = min(r, g, b) Установить diff = cmax - cmin Если cmax == cmin, то, Установить h = 0 End if Если cmax == r, то, Установить h = fmod((60 * ((g - b) / diff) + 360), 360.0) End Else if Если cmax == g, то, Установить h = fmod((60 * ((b - r) / diff) + 120), 360.0) End Else if Если cmax == b, то, Установить h = fmod((60 * ((r - g) / diff) + 240), 360.0) End Else if Если cmax == 0, то, Установить s = 0 End if Else Установить s = (diff / cmax) * 100 End Else v = cmax * 100; Print h, s, v Шаг 4 -> int main(int argc, char const *argv[]) Декларировать и инициализировать 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); // Максимальное значение r, g, b float cmin = min(r, g, b); // Минимальное значение r, g, b float diff = cmax - cmin; // Разница между 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); //Если cmax равен нулю if (cmax == 0) s = 0; else s = (diff / cmax) * 100; //Расчёт v- v = cmax * 100; printf("h s v=(%f, %f, %f)\n", h, s, v); return 0; } //Основная функция int main(int argc, char const *argv[]) { int r = 45, g = 215, b = 0; rgb_to_hsv(r, g, b); return 0; }
Результат вывода
h s v=(107.441864, 100.000000, 84.313728)