可见光的波长转换为RGB值颜色,光谱波长与RGBA分量,不同波长的光转换成不同的RGB值,JavaScript版本

2023-05-16

JS版本的光谱波长转换RGBA颜色值的方法,在网上没找到,后来领导发来一个C++版本的,我对照着改为JS版,有需要的朋友 可以参考,代码如下:

<html>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"></head>
<body>
<div id="mainDiv"></div>
<script>
// 指定波长转换成RGBA颜色
function lambdaToColor(lambda, gamma, intensityMax) {
	if (typeof(gamma)=='undefined') {
		gamma = 0.8; // double
	}
	if (typeof(intensityMax)=='undefined') {
		intensityMax = 255.0; // double
	}
    var r, g, b, alpha; // double
    if (lambda >= 380.0 && lambda < 440.0) {
        r = -1.0 * (lambda - 440.0) / (440.0 - 380.0);
        g = 0.0;
        b = 1.0;
    }else if (lambda >= 440.0 && lambda < 490.0) {
        r = 0.0;
        g = (lambda - 440.0) / (490.0 - 440.0);
        b = 1.0;
    }else if (lambda >= 490.0 && lambda < 510.0) {
        r = 0.0;
        g = 1.0;
        b = -1.0 * (lambda - 510.0) / (510.0 - 490.0);
    }else if (lambda >= 510.0 && lambda < 580.0) {
        r = (lambda - 510.0) / (580.0 - 510.0);
        g = 1.0;
        b = 0.0;
    }else if (lambda >= 580.0 && lambda < 645.0) {
        r = 1.0;
        g = -1.0 * (lambda - 645.0) / (645.0 - 580.0);
        b = 0.0;
    }else if (lambda >= 645.0 && lambda <= 780.0) {
        r = 1.0;
        g = 0.0;
        b = 0.0;
    }else {
        r = 0.0;
        g = 0.0;
        b = 0.0;
    }
	// 在可见光谱的边缘处强度较低。
    if (lambda >= 380.0 && lambda < 420.0) {
        alpha = 0.30 + 0.70 * (lambda - 380.0) / (420.0 - 380.0);
    }else if (lambda >= 420.0 && lambda < 701.0) {
        alpha = 1.0;
    }else if (lambda >= 701.0 && lambda < 780.0) {
        alpha = 0.30 + 0.70 * (780.0 - lambda) / (780.0 - 700.0);
    }else {
        alpha = 0.0;
    }
	// 1953年在引入NTSC电视时,计算具有荧光体的监视器的亮度公式如下
    var Y = (0.212671*r + 0.715160*g + 0.072169*b); // Math.round
	// 伽马射线 gamma
    // 照明强度 intensityMax
    var R = r == 0.0 ? 0 : Math.round(intensityMax * Math.pow(r * alpha, gamma));
    var G = g == 0.0 ? 0 : Math.round(intensityMax * Math.pow(g * alpha, gamma));
    var B = b == 0.0 ? 0 : Math.round(intensityMax * Math.pow(b * alpha, gamma));
    var A = (alpha); // Math.round
	// return
    return {r:R, g:G, b:B, a:A, y:Y};
}

var arrHtml = [];
for (var i = 380.0; i<=780.0; i+=0.5) {
	var lambda = i; // double
	var gamma = 0.8; // double
	var intensityMax = 255.0; // double
	var res = lambdaToColor(lambda, gamma, intensityMax);
	var rgba = 'rgba(' + res.r + ', ' + res.g + ', ' + res.b + ', ' + res.a + ')';
	console.log('Lambda:' + lambda + ', ' + rgba + ', ' + res.y);
	// rgba = 'rgb(' + res.r + ', ' + res.g + ', ' + res.b + ')';
	arrHtml.push('<div style="background-color:'+ rgba +'; width:1px;height:200px;display:inline-block;"></div>');
}
document.getElementById('mainDiv').innerHTML = arrHtml.join('');
</script>
</body>
</html>

上面代码的效果截图如下:

原版C++代码如下(出处未知):

//指定波长转换成RGBA颜色
std::vector<int> lambdaToColor(double lambda,double gamma = 0.8,double intensityMax = 255.0)
{
    double r, g, b, alpha;
    if (lambda >= 380.0 && lambda < 440.0) {
        r = -1.0 * (lambda - 440.0) / (440.0 - 380.0);
        g = 0.0;
        b = 1.0;
    }else if (lambda >= 440.0 && lambda < 490.0) {
        r = 0.0;
        g = (lambda - 440.0) / (490.0 - 440.0);
        b = 1.0;
    }else if (lambda >= 490.0 && lambda < 510.0) {
        r = 0.0;
        g = 1.0;
        b = -1.0 * (lambda - 510.0) / (510.0 - 490.0);
    }else if (lambda >= 510.0 && lambda < 580.0) {
        r = (lambda - 510.0) / (580.0 - 510.0);
        g = 1.0;
        b = 0.0;
    }else if (lambda >= 580.0 && lambda < 645.0) {
        r = 1.0;
        g = -1.0 * (lambda - 645.0) / (645.0 - 580.0);
        b = 0.0;
    }else if (lambda >= 645.0 && lambda <= 780.0) {
        r = 1.0;
        g = 0.0;
        b = 0.0;
    }else {
        r = 0.0;
        g = 0.0;
        b = 0.0;
    }

    //在可见光谱的边缘处强度较低。
    if (lambda >= 380.0 && lambda < 420.0) {
        alpha = 0.30 + 0.70 * (lambda - 380.0) / (420.0 - 380.0);
    }else if (lambda >= 420.0 && lambda < 701.0) {
        alpha = 1.0;
    }else if (lambda >= 701.0 && lambda < 780.0) {
        alpha = 0.30 + 0.70 * (780.0 - lambda) / (780.0 - 700.0);
    }else {
        alpha = 0.0;
    }

    //1953年在引入NTSC电视时,计算具有荧光体的监视器的亮度公式如下
    int Y = static_cast<int>(0.212671*r + 0.715160*g + 0.072169*b);

    //伽马射线 gamma
    //照明强度 intensityMax
    int R = r == 0.0 ? 0 : static_cast<int>(std::round(intensityMax * std::pow(r * alpha, gamma)));
    int G = g == 0.0 ? 0 : static_cast<int>(std::round(intensityMax * std::pow(g * alpha, gamma)));
    int B = b == 0.0 ? 0 : static_cast<int>(std::round(intensityMax * std::pow(b * alpha, gamma)));
    int A = static_cast<int>(alpha);

    return std::vector<int>{R, G, B, A, Y};
}

 

(完)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可见光的波长转换为RGB值颜色,光谱波长与RGBA分量,不同波长的光转换成不同的RGB值,JavaScript版本 的相关文章

  • Linux用户及权限管理(一)用户和组

    更新时间2020 04 09 1 ubuntu 用户系统概述 ubuntu linux 是一个多用户多任务的分时操作系统 任何一个要使用系统资源的用户 xff0c 都必须先要向系统管理员申请一个账号 xff0c 然后以这个账号的身份进入系统
  • Linux用户及权限管理(二)用户和组管理命令

    更新时间2020 05 12 在第一节中将了图形界面的用户管理 xff0c 本节讲解与用户和组管理相关的shell命令 1 配置文件 第一节中讲到 etc passwd文件 xff0c 它记录了当前操作系统中所有用户的基本信息 xff1a
  • Linux用户及权限管理(三)权限管理

    更新时间2020 05 13 在使用windows的时候关于权限管理的操作不多 xff0c 大家遇到比较多的应该是 xff1a 使用管理员身份才能正常运行某个程序 xff0c 或者删除某个文件 xff1b hosts文件无法修改 xff0c
  • C# 快速入门笔记

    最后更新时间2020 04 10 C 快速入门精简笔记 Chapter 0 前言Chapter 1 基础1 1 简介1 2 环境1 3 程序结构1 4 基本语法1 5 数据类型1 5 1 value types1 5 2 Reference
  • MATLAB的一点小tips

    更新时间2020 04 15 目录 1 matlab运算符2 matlab特殊变量和常量3 matlab保存工作区4 who 和whos5 长任务6 format 1 matlab运算符 运算符目的 43 加 xff1b 加法运算符 减 x
  • MATLAB矩阵和数组相关函数解析

    更新时间2020 04 15 未完结 目录 1 总表2 简单示例2 1 zeros2 2 ones2 3 rand2 4 true and false2 5 eye 1 总表 点击表中函数名可以跳转至官方网站查看精确英文解析 xff0c 也
  • HTTPS、SSL、TLS三者之间的联系和区别

    SSL Secure Socket Layer 安全套接层 是基于HTTPS下的一个协议加密层 xff0c 最初是由网景公司 xff08 Netscape xff09 研发 xff0c 后被IETF xff08 The Internet E
  • Word论文公式的两个格式问题

    更新时间2020 04 16 1 公式居中 xff0c 编号右对齐 solution xff1a 编写一个样式 xff0c 一劳永逸 你要居中 xff0c 你要右对齐 xff0c 先要有个参考 即你居中的 中 是哪里 xff0c 右对齐的
  • HTML- markdown版 江城子·乙卯正月二十日夜记梦

    江城子 乙卯正月二十日夜记梦 宋 苏轼 十年生死两茫茫 xff0c 不思量 xff0c 自难忘 千里孤坟 xff0c 无处话凄凉 纵使相逢应不识 xff0c 尘满面 xff0c 鬓如霜 夜来幽梦忽还乡 xff0c 小轩窗 xff0c 正梳妆
  • Keil μvision已停止工作?

    今天以及几周前我都遇到了这个问题 xff0c 提示消息都是一样的 xff0c Keil vision已停止工作 xff0c 接着keil就自己关闭了 我两次的原因不一样 1 第一次 用的是F407的板子 xff0c 排查了半天错误 xff0
  • 负数取余,取余和取模

    1 圆整 就是把一个小数或者说浮点数按某种规律近似为一个它左边或右边最近的一个整数 比如 xff1a 向负无穷圆整 span class token number 1 8 span span class token operator gt
  • [joint_state_publisher-3] process has died

    我是ROS melodic xff0c 其他版本应该一样的解决方法 去掉urdf xacro launch文件中的中文注释 xff0c 或者改为英文 xff0c 而且第一行不能有中文
  • Ubuntu 18.04安装N卡驱动

    1 原来 xff0c 是英特尔的集显 2 添加N卡驱动 检查是否有GPU显卡 xff0c 我电脑一张集显 xff0c 一张独显 xff0c 很清楚 如果不清楚的可以用 lspci grep i nvidia查看 xff1a linux202
  • ROS Melodic Arbotix报错

    ImportError dynamic module does not define module export function PyInit tf2 xff09 这是我做的内容 xff1a 1 创建一个四轮小车URDF模型 xff0c
  • Matlab画线性规划可行域

    线性规划什么的应该是运筹学的内容 xff0c 虽然数学建模比赛不会考这个 xff0c 但大家日常学习还是会遇到相关的问题 除了用单纯型法 xff0c 也可以用传统的画图法 xff0c 画出可行域 xff0c 再寻求可行解 可行域一般手画更快
  • 浅谈论文目录制作

    先来看咱们CSDN的目录 Markdown语句 xff1a 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 效果如下 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 我们论文中的目录道理也是一样 xff0c 无非就是
  • Linux文件系统(一)文件系统基本概念

    文件系统基本概念 1 文件系统概述2 文件系统的类型 xff08 1 xff09 ext系列 xff08 2 xff09 Reiserfs 3 Ubuntu文件系统的结构 xff08 1 xff09 概述 xff08 2 xff09 路径
  • 47、基于51单片机万年历温度闹钟农历阳历LCD 12864显示系统设计

    摘要 本文介绍了基于STC89C52单片机的多功能电子万年历的硬件结构和软硬件设计方法 本设计由数据显示模块 温度采集模块 时间处理模块和调整设置模块四个模块组成 系统以STC89C52单片机为控制器 xff0c 以串行时钟日历芯片DS13
  • Linux文件系统(二)交换分区

    1 交换分区的概念 2 交换分区的管理
  • Linux文件系统(三)文档压缩及解压缩

    1 文档压缩概述 2 图形化归档工具 3 命令行工具

随机推荐

  • Linux文件系统(四)文件系统管理命令

    1 文件系统的基本操作 2 目录的基本操作 3 查看文件内容 4 文件类型 5 查询文件 6 其他管理命令
  • EndNote文献管理(一)雾里看花

    简介
  • EndNote文献管理(二)基操勿六

    1 创建文献数据库并添加文献1 1创建文献数据库1 2在线检索1 3批量导入1 4导入知网文献 2 文献管理2 1文献标记与排序2 2文献速览与下载全文2 3文献阅读与批注 3 编辑参考文献格式 1 创建文献数据库并添加文献 1 1创建文献
  • SQL Server(2019) 实验一 数据库和表的建立

    数据库和表的建立 一 实验目的二 实验内容和要求2 1 数据库的创建 2 2 表的创建 查看 修改和删除 2 2 1 xff0e 表的创建 2 2 2 xff0e 向创建的表中添加数据记录 2 2 3 xff0e 修改表结构 xff08 找
  • SQL Server 中时间的几种表示

    在SQL Server中 xff0c 点开数据类型 xff0c 单单是时间这一类变量都有着多重数据类型 datetimetimestampdatetimedatetime2datetimeoffset 他们的显示效果如下 xff1a spa
  • SQL Server(2019) 实验二 单表查询

    单表查询 一 实验目的二 实验内容和要求2 1 表结构修改2 1 1 xff0e 在实验三的所建立的数据库中增加Teacher表 xff0c 结构如下 xff1a 2 1 2 xff0e 在实验三的所建立的数据库中增加Teaching表 x
  • SQL Server(2019)导入excel数据

    要导入的excel文件如图所示 xff0c 600个记录 操作步骤 xff1a 1 在要导入的数据库上右键 xff0c 任务 xff0c 导入数据 2 选择数据源为excel xff0c 选择相应excel文件 xff0c 选择excel版
  • SQL Server(2019)导出excel数据

    目标 xff1a 将Grademanager数据库中的test表导出为excel test表内容 xff1a 如图 xff0c 600条记录 操作步骤 xff1a 1 在相应数据库上右键 xff0c 任务 xff0c 导出数据 2 选择数据
  • 机器视觉特征提取介绍:HOG、SIFT、SURF、ORB、LBP、HAAR

    一 概述 这里主要记录自己的一些感悟 xff0c 不是很系统 想要详细系统的理论 xff0c 请参考文末的 图像处理之特征提取 个人不是专业cv工程师 xff0c 很多细节没有深究 xff0c 描述可能不严谨 在总结物体检测算法之前先把基础
  • ROS低调复习总结

    ROS复习 一 考试时间 形式 日期二 题型三 不知道随便写四 课程知识点 难点1 1 3章课后复习题1 1 单元测试一1 2 单元测试二1 3 单元测试三 2 第二章 ROS系统架构2 1 比较Topic与Service通信2 2 关闭一
  • 了解Web前端-1 Http基本原理

    HTTP基本原理 1 HTTP协议2 HTTP与Web服务器3 浏览器中的请求和响应1xx 信息2xx 成功3xx 重定向4xx 客户端错误5xx 服务器错误 1 HTTP协议 Hyper Text Transfer Protocol xf
  • 了解Web前端2-HTML语言

    HTML语言 1 什么是HTML2 了解HTML结构4 HTML的基本标签4 1 不是标签4 2 文件开始标签 96 96 4 3文件头部标签 96 96 4 4文件标题标签 96 96 4 5元信息标签 96 96 4 6页面的主体标签
  • 了解Web前端3-CSS层叠样式表

    CSS样式层叠表 1 CSS 概述2 属性选择器2 1属性选择器2 2属性和值选择器2 3属性和值的选择器 多值 3 类和ID选择器3 1ID选择器3 2类选择器3 3为特定元素使用class 1 CSS 概述 CSS是一种标记语言 xff
  • 了解Web前端4-JavaScript动态脚本语言

    JavaScript 动态脚本语言 1 页面中直接嵌入JavaScript代码2 连接外部JavaScript文件 JavaScript 是 web 开发人员必须学习的 3 门语言中的一门 xff1a HTML 定义了网页的内容CSS 描述
  • 爬虫の简介

    爬虫简介 一 什么是爬虫二 Python爬虫架构 一 什么是爬虫 爬虫 xff1a 一段自动抓取互联网信息的程序 xff0c 从互联网上抓取对于我们有价值的信息 二 Python爬虫架构 Python 爬虫架构主要由五个部分组成 xff0c
  • 一个不错的在线作图网站

    菜鸟教程的一个在线工具 连接 xff1a https c runoob com more shapefly diagram 优点 xff1a 没有广告 xff0c 不用关注微信公众号 xff0c 不用登陆 此外 xff0c 菜鸟还提供了其他
  • ABB机器人复习

    1 工业机器人最显著的特点 xff1a 2 工业气人的5种典型的结构 xff1a 3 认识示教器 xff1a 4 ABB机器人坐标系 xff1a 5 轴运动与线性运动 xff1a 1 轴运动 xff1a 2 线性运动 xff1a 6 重定位
  • step7basic的许可无法彻底完成

    安装博途并 后 xff0c 在项目中选择设备时可能会出现 xff1a step7basic的许可无法彻底完成 因为automation license manager中 的报错 原因 xff1a win10系统的更新 xff0c 导致软件不
  • 西门子学习第一章 S7-1200基础

    第一章 1 1 S7 1200系统概述 xff08 1 xff09 PLC 运用领域 xff08 2 xff09 S7 1200外观 xff08 3 xff09 西门子系列分类 1 2博途软件1 3 S7 1200系列PLC的硬件介绍 xf
  • 可见光的波长转换为RGB值颜色,光谱波长与RGBA分量,不同波长的光转换成不同的RGB值,JavaScript版本

    JS版本的光谱波长转换RGBA颜色值的方法 xff0c 在网上没找到 xff0c 后来领导发来一个C 43 43 版本的 xff0c 我对照着改为JS版 xff0c 有需要的朋友 可以参考 xff0c 代码如下 xff1a lt html