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

Программа на C для изменения модели цвета RGB на HSV

Дан диапазон цветов RGB (в виде целых чисел); задачей является нахождение подходящего диапазона цветов HSV через преобразование диапазона цветов RGB

Что такое модель цвета RGB?

Модель цвета RGB состоит из красного, зеленого и синего цветов. Модель RGB является широко используемой моделью цвета в технологии отображения. Это накопительная модель, в которой мы добавляем эти три цвета с различной интенсивностью, чтобы на дисплее устройства образовалось миллионы различных цветов.

Что такое модель цвета HSV?

Модель цвета HSV включает в себя тон, насыщенность и значение, также известную как HSB (тон, насыщенность,亮度). Модель HSV является заменителем модели цвета RGB. Она адаптирована в соответствии с восприятием цвета человеческим зрением. Из-за своей естественной схемы配色, эта модель цвета часто используется художниками. Три属性 HSV могут быть добавлены или вычтены.

What we need to do in the program

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

Algorithm

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)
Основной учебник
Рекомендуется к просмотру