C语言程序将RGB颜色模型转换为HSV颜色模型
给定以整数形式表示的RGB颜色范围;任务是通过转换RGB颜色范围来找到其相应的HSV颜色。
什么是RGB颜色模型?
RGB颜色模型由三种颜色组成:红色、绿色和蓝色。RGB模型是一种广泛应用于显示技术的颜色模型;它是一种加色模型,其中我们将这三种颜色以不同的强度叠加,以在显示设备上产生数百万种不同的颜色。
什么是HSV颜色模型?
HSV颜色模型包含色相、饱和度、明度,也称为HSB(色相、饱和度、亮度)。HSV是RGB颜色模型的另一种表示方式。它以人类视觉感知颜色属性的方式对齐。由于其自然的颜色方案,这种颜色模型更常被艺术家使用。HSV的三个属性可以是加色的,也可以是减色的。
程序中我们需要做什么?
我们需要从用户那里获取RGB模型值的输入,然后用数学方法计算HSV颜色模型的输出。
示例
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)
我们将使用的方法来解决给定的问题 -
- 获取3种颜色的输入:红色(r)、绿色(g)和蓝色(b)。
- 将所有颜色值除以255。
- 现在计算cmax、cmin和差值。
- 检查 -
- 如果cmax和cmin等于0,则色相或h将为0。
- 如果cmax等于红色(r),则色相(h) = (60 * ((g – b) / diff) + 360) % 360。
- 如果cmax等于绿色(g),则色相(h) = (60 * ((b – r) / diff) + 120) % 360。
- 如果cmax等于蓝色(b),则色相(h) = (60 * ((r – g) / diff) + 240) % 360。
- 要找到饱和度,我们将检查 -
- 如果cmax = 0,则饱和度(s) = 0。
- 如果cmax不等于零,则饱和度(s) = (diff/cmax)*100
- 明度计算 -
- 明度(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 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 values are divided by 255
// to change the range from 0..255 to 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);
// if cmax equal zero
if (cmax == 0)
s = 0;
else
s = (diff / cmax) * 100;
// compute v
v = cmax * 100;
printf("h s v=(%f, %f, %f)
", h, s, v );
return 0;
}
//main function
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)
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C编程
C++
C#
MongoDB
MySQL
Javascript
PHP