C++最精准的RGB-HSB(HSV)-HSL的色值转换

本文提供了一组C++代码实现RGB到HSV(HSB)和HSL颜色模型的转换,并包含了边界值调整及公式正确性的检查。通过输入RGB值,输出对应的HSV和HSL值,同时验证转换的准确性。
摘要由CSDN通过智能技术生成

#include <iostream>
#include <math.h>

using namespace std;

// HSB hue 色相 saturation 饱和度 brightness 亮度 (有些地方用HSV代替 v代表value
// 也就是指亮度值)
// HSL hue 色相 saturation 饱和度 lightness 明度
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

struct RGB // 定义 RGB 结构体
{
  float r;
  float g;
  float b;
};
struct HSV // 定义HSV结构体
{
  float h;
  float s;
  float v;
};

struct HSL // 定义HSL结构体
{
  float h;
  float s;
  float l;
};

// 调整RGB的值
void adjustRGB(RGB &rgb) {
  if (rgb.r < 0) {
    rgb.r = 0;
  }
  if (rgb.g < 0) {
    rgb.g = 0;
  }
  if (rgb.b < 0) {
    rgb.b = 0;
  }

  if (rgb.r > 255) {
    rgb.r = 255;
  }
  if (rgb.g > 255) {
    rgb.g = 255;
  }
  if (rgb.b > 255) {
    rgb.b = 255;
  }
}

// 调整 HSV的值
void adjustHSV(HSV &hsv) {
  if (hsv.h < 0) {
    hsv.h = 0;
  }
  if (hsv.s < 0) {
    hsv.s = 0;
  }
  if (hsv.v < 0) {
    hsv.v = 0;
  }

  if (hsv.h > 360) {
    hsv.h = 360;
  }
  if (hsv.s > 100) {
    hsv.s = 100;
  }
  if (hsv.v > 100) {
    hsv.v = 100;
  }
}

// 调整 HSL的值
void adjustHSL(HSL &hsl) {
  if (hsl.h < 0) {
    hsl.h = 0;
  }
  if (hsl.s < 0) {
    hsl.s = 0;
  }
  if (hsl.l < 0) {
    hsl.l = 0;
  }

  if (hsl.h > 360) {
    hsl.h = 360;
  }
  if (hsl.s > 100) {
    hsl.s = 100;
  }
  if (hsl.l > 100) {
    hsl.l = 100;
  }
}

// 将RGB格式转换为HSV(HSB)格式
void RGB2HSV(RGB rgb, HSV &hsv) {
  float b, g, r;
  float h, s, v;
  float min, max; // t,g,b 中的最小和最大值
  float delta;

  b = rgb.b / 255.f;
  g = rgb.g / 255.f;
  r = rgb.r / 255.f;

  max = MAX(r, g);
  max = MAX(max, b);

  min = MIN(r, g);
  min = MIN(min, b);

  v = max;
  delta = max - min;

  if (max == 0.0f) {
    s = 0.0f;
  } else {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程经验随笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值