使用 HTML5 画布创建颜色选择渐变(所有可能的 RGB 颜色)

2023-12-11

是否可以为线性颜色选择器创建包含所有可能的 RGB 颜色(仅红色、绿色、蓝色 - 无 alpha 值)的线性渐变。

到目前为止,我已经尝试使用以下渐变,但它不包含来自的所有值rgb(0,0,0) to rgb(255,255,255) :

var grd = ctx.createLinearGradient(0, 0, width, 0);
grd.addColorStop(0,     'red');
grd.addColorStop(1 / 6, 'orange');
grd.addColorStop(2 / 6, 'yellow');
grd.addColorStop(3 / 6, 'green')
grd.addColorStop(4 / 6, 'aqua');
grd.addColorStop(5 / 6, 'blue');
grd.addColorStop(1,     'purple');

非常感谢任何帮助。


不幸的是,不,你不能。

The main reason is that 24-bit RGB contains 16,777,216 number of colors (2563). Just to get an estimate you will will need a screen resolution that is 4096 x 4096 pixels (of course there is no such square screen, but the equivalent would be in about 16:9 format of that for an actual monitor).

简而言之:普通屏幕上没有空间放置所有像素。

此外,使用渐变时会遇到问题,因为渐变仅在画布的一个方向上进行。您需要在两个方向上绘制颜色,您需要直接手动操作位图。

我的建议是拍摄现有此类调色板的屏幕快照并将该图像绘制到画布上。这将量化颜色(这也会发生在所有可用的颜色选择器中),但会给您一个接近您需要的颜色。

此外,您还可以添加滑块来微调值以及文本框(后者在纯canvas中有点复杂,但您可以将html和canvas结合起来来实现这一点)。

代表“所有”颜色的近似值可能如下所示(下面演示的快照):

Snapshot from demo below

Update

好的,我答应会回复您有关根据 RGB 值计算位置的信息。从图像中的调色板开始,您可以通过将颜色转换为 HSV 颜色空间来轻松计算位置。

将 RGB 转换为 HSV 的函数如下所示:

function rgb2hsv() {

    var rr, gg, bb,

    r = arguments[0] / 255,
    g = arguments[1] / 255,
    b = arguments[2] / 255,
    h, s,

    v = Math.max(r, g, b),
    diff = v - Math.min(r, g, b),
    diffc = function (c) {
        return (v - c) / 6 / diff + 1 / 2;
    };

    if (diff === 0) {
        h = s = 0;

    } else {
        s = diff / v;

        rr = diffc(r);
        gg = diffc(g);
        bb = diffc(b);

        if (r === v) {h = bb - gg}
        else if (g === v) {h = (1 / 3) + rr - bb} 
        else if (b === v) {h = (2 / 3) + gg - rr};
        if (h < 0) {h += 1}
        else if (h > 1) {h -= 1}
    }

    return {
        h: (h * 360 + 0.5) |0,
        s: (s * 100 + 0.5) |0,
        v: (v * 100 + 0.5) |0
    }
};

现在颜色以度数 (0-359)、饱和度 (0-100) 和亮度 (0-100) 表示。

要获得水平位置,您需要做的就是将调色板的宽度除以 360 并乘以 h(色调)。为了获得垂直位置,您将调色板分为上部和下部。如果饱和度

function getPos(canvas, h, s, v) {

var m = canvas.height / 2,
    x = canvas.width / 360 * h,
    y;

if (s === 100 && v === 100) {
    y = m;

} else if (v === 100 && s < 100) {
    y = m / 100 * s;

} else if (s === 100 && v < 100) {
    y = m / 100 * (100 - v) + m;
}

x = (x + 0.5) |0; //convert to integer
y = (y + 0.5) |0;

};

这当然要求您生成的调色板非常准确。

Demo

请注意,光标不是根据鼠标位置设置的,而是根据 RGB (HSV) 值设置的。它首先从鼠标位置选取 RGB 颜色,然后将其转换为 HSV 并据此计算位置。

调色板是根据窗口大小动态生成的。

对于纯色拾取还值得一提的是,看起来平滑的渐变的问题是它们会抖动。这意味着您可以获得显然不在您选择范围内的像素值。

为了在进行颜色选择时减少此问题,您需要对从鼠标获得的 x 和 y 位置周围的区域进行平均。

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

使用 HTML5 画布创建颜色选择渐变(所有可能的 RGB 颜色) 的相关文章

随机推荐

  • 如何显示 wget 的对话框量表?

    我想显示进度wget使用对话框 gauge 我找到了一个解决方案在这个网站上但它的显示率并未达到 100 90 后 对话框冻结 停止并且代码退出 有没有办法显示 wget 的对话框量表 URL http upload wikimedia o
  • 在 clickhouse 中将日期转换为 Jalal 日期

    我使用clickhouse版本22 3 15 33 在我的表中 日期的格式如下 2023 01 15 我想计算表中每个 Jalal 月份变量的总和 所以首先我需要将此日期转换为 Jalal 日期 然后获取月份 然后使用group by基于月
  • 将图像和文本共享到 Facebook Messenger,但 UIActivityViewController 失败

    Question 必须对以下代码进行哪些更改才能确保 Messenger 正常运行 很好地与UIActivityViewController并分享图像和 文本 或者至少是图像 背景 我在用UIActivityViewController分享
  • 在哪里可以找到“SDL_Window”的定义

    我刚刚开始在 Linux 中学习 SDL2 我正在阅读 LazyFoo 的第一个教程 我看到有该代码 The window we ll be rendering to SDL Window window NULL 在哪里可以找到的定义SDL
  • 具有返回 char* 函数的内存管理

    今天 我没有多想 就根据给定枚举值的 switch 语句编写了一个返回 char 的简单函数 然而 这让我想知道如何释放那段记忆 我所做的是这样的 char func char retval new char 20 Switch blah
  • 如何在同一个图表上合并一条线和散点图?

    使用 Rplotly 包创建时 从 data frame 创建的两个单独的图表可以正常工作 然而 我不知道如何将它们组合成一个 大概是使用 add trace 函数 df lt data frame season c 2000 2000 2
  • 如何访问框架内的页面内容?

    我在主窗口内有一个框架 里面有一个带有面板和各种内容的页面 主窗口决定加载哪个页面 然后必须与其内容交互 这就是问题所在 我已经尝试了很多解决方案 最好的是这个 但返回 pageLogin 作为空对象 mainFrame Source ne
  • 在源代码树而不是包中运行所有测试

    我的单元测试与集成测试位于单独的目录树中 但具有相同的包结构 我的集成测试需要可用的外部资源 例如服务器 但我的单元测试完全独立于彼此和环境 在 IntelliJ IDEA v7 中 我定义了一个 JUnit 运行 调试配置来运行顶级包中的
  • 理解这个removeAll java方法和arrayList

    此方法的职责是删除所有出现的值toRemove来自数组列表 剩余的元素应该只是向列表的开头移动 大小不会改变 末尾的所有 额外 元素 但是多次出现toRemove位于列表中 应该只用 0 填充 该方法没有返回值 如果列表没有元素 那么它应该
  • 考虑到记录的大小,在网格视图中实现分页的最佳程序是什么?

    我在 sq server db 中有一个表有超过 100 万行 我需要在 gridview 中显示这些数据 并在 asp net 页面中分页 由于记录量较大 我需要提高页面显示数据的性能 实现分页 我应该遵循什么程序来实现分页 请帮忙 有多
  • Python - getattr 和串联

    因此 在我的代码中使用 getattr 时 我发现了以下内容 myVariable foo A bar 有效 但是是这样的 B A myVariable getattr foo B bar 返回错误 指出 foo 不包含属性 A bar 我
  • 如何在 pygtk 中更改 gtk.TreeView 的交替背景行颜色?

    我正在尝试更改树视图的交替背景颜色 我知道这通常应该由主题决定 但我想重写以测试 gtk 样式功能 根据树形视图文档here 我了解到 TreeView 有几个只读的样式选项 包括 偶数行颜色 奇数行颜色 和 允许规则 根据文档 允许绘制偶
  • php: file_get_contents() 可与 CLI 配合使用,但在服务器上调用时不起作用(在页面中)

    我有点困惑 我正在使用 bit ly PHP API 来缩短一些网址 这在本地主机上运行良好 但是当我在我的服务器上尝试它时 在 Apache 中运行的 php file get contents 返回一个空字符串 我检查了 apache
  • 列插入或更新与先前的 CREATE RULE 语句强加的规则冲突

    我正在开发一款在线游戏 我在向表插入新数据时遇到一些问题 我越来越 2010 4 8 2 14 37000 513 微软 ODBC SQL Server 驱动程序 SQL Server 列插入或 更新与强加的规则冲突 通过先前的 CREAT
  • 带图像的角度选择

    情况 我需要在语言选择中插入标志 我在 Google 和 StackOverflow 中进行了搜索 但找到的解决方案对我不起作用 代码 在控制器中 scope language list name english url https raw
  • 为什么这个简单的移动表单在使用播放器时没有关闭

    我使用关闭按钮创建了这个简单的示例表单 不使用 Interop WMPLib dll 时 一切都按预期工作 我见过其他应用程序使用它没有问题 但为什么当我添加以下行时表单进程没有关闭 SoundPlayer myPlayer new Sou
  • jQuery 绑定事件根本不起作用

    我尽了一切努力去实现它 但没有成功 问题是我在运行时创建一个元素 然后将一个函数绑定到该元素 如下代码所示 document ready function rem click function body append a href runt
  • 从 QR 分解中获取帽子矩阵以进行加权最小二乘回归

    我正在尝试延长lwr 包的功能McSptial 它适合作为非参数估计的加权回归 在核心lwr 函数 它使用以下方式反转矩阵solve 而不是 QR 分解 导致数值不稳定 我想改变它 但不知道如何从 QR 分解中获取帽子矩阵 或其他导数 有数
  • 在 emacs 中使用 rebar 吗?

    有一个defun在 emacs 中获取 erlang 项目路径 如何执行 shell 命令来执行以下操作 cd erlang project folder make 我正在使用 rebar 来构建我的项目 并且有一个 Makefile 可以
  • 使用 HTML5 画布创建颜色选择渐变(所有可能的 RGB 颜色)

    是否可以为线性颜色选择器创建包含所有可能的 RGB 颜色 仅红色 绿色 蓝色 无 alpha 值 的线性渐变 到目前为止 我已经尝试使用以下渐变 但它不包含来自的所有值rgb 0 0 0 to rgb 255 255 255 var grd