Canvas像素点拾色器核心是先绘制颜色再用getImageData读取RGBA值;需显式设置canvas宽高属性,用getBoundingClientRect换算鼠标坐标,验证范围后读取data数组,并可转为十六进制或RGBA字符串。

Canvas 像素点拾色器的核心,就是把颜色“画出来”,再用 getImageData 精准读取鼠标点击处的 RGBA 值。不依赖第三方库,纯原生 HTML5 + JavaScript 就能跑通。
canvas 宽高必须设对
不能只靠 CSS 设置尺寸,否则坐标会错乱。必须显式设置 canvas 元素的 width 和 height 属性(单位是像素),例如:<canvas id="picker" width="300" height="100"></canvas>
JavaScript 中也建议同步赋值,避免缩放干扰:
- 用
canvas.width = 300、canvas.height = 100显式重设 - 获取上下文:
const ctx = canvas.getContext('2d')
先画出可拾取的颜色源
拾色器需要有“颜色载体”。常见两类做法:
-
绘制渐变调色板:用
createLinearGradient或createRadialGradient生成色条或色环,再填满 canvas -
绘制图片:用
drawImage把<img>绘到 canvas 上;若为跨域图片,务必提前加crossOrigin="anonymous"
示例(横向 RGB 渐变):
const grad = ctx.createLinearGradient(0, 0, canvas.width, 0); grad.addColorStop(0, '#ff0000'); grad.addColorStop(0.5, '#00ff00'); grad.addColorStop(1, '#0000ff'); ctx.fillStyle = grad; ctx.fillRect(0, 0, canvas.width, canvas.height);
准确换算鼠标坐标并读取像素
点击时,需把鼠标位置转成相对于 canvas 左上角的整数坐标,并确保在有效范围内:
- 推荐用
e.clientX / e.clientY配合canvas.getBoundingClientRect()计算,兼容性更稳 - 验证
x ≥ 0 && y ≥ 0 && x < canvas.width && y < canvas.height,否则getImageData会报错 - 调用
ctx.getImageData(x, y, 1, 1),返回对象的.data是长度为 4 的数组:[R, G, B, A](每个值 0–255)
格式转换与视觉反馈
拿到原始数值后,常需转成常用格式,并增强交互体验:
- 十六进制:
('#' + r.toString(16).padStart(2,'0') + g.toString(16).padStart(2,'0') + b.toString(16).padStart(2,'0')) - RGBA 字符串:
`rgba(${r}, ${g}, ${b}, ${(a/255).toFixed(2)}` - 可在 canvas 上临时画个小圆点或十字标记选中位置,提升操作感


















