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


    #include
    #include

    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 {

  • 相关阅读:
    kmp算法 Java
    3、核心配置文件
    Ablebits Ultimate Suite for Excel
    Pushgateway的场景使用
    超越datetime:Arrow,Python中的日期时间管理大师
    UGUI源码解析——Image
    AndroidBanner - ViewPager 03
    【牛客刷题-算法】NC32 求平方根 (又是辛苦debug的一天)
    list的模拟实现
    [ 隧道技术 ] 反弹shell的集中常见方式(一)nc反弹shell
  • 原文地址:https://blog.csdn.net/lizfs_csdn/article/details/127912792