图片颜色吸管工具
上传图片并点击图片中的任何区域来采集颜色:
十六进制代码: #000000
RGB值: rgb(0, 0, 0)
上传图片并点击图片中的任何区域来采集颜色:
十六进制代码: #000000
RGB值: rgb(0, 0, 0)
通过该工具可以用来确定网站主色调、设计海报、设计网页等。
本工具主要由以下几个部分组成:
用户通过 <input type="file">
选择图片后,利用 JavaScript FileReader
API 读取图片数据,并将其绘制到 <canvas>
画布上。
colorPickerImageUploader.addEventListener('change', function(e) {
const file = e.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = function(event) {
img.onload = function() {
// 计算图片缩放比例,最大宽度 800px,保持比例
const maxWidth = 800;
const scale = img.width > maxWidth ? maxWidth / img.width : 1;
const newWidth = img.width * scale;
const newHeight = img.height * scale;
// 设置画布大小与图片一致
colorPickerCanvas.width = newWidth;
colorPickerCanvas.height = newHeight;
// 在画布上绘制图片
ctx.drawImage(img, 0, 0, newWidth, newHeight);
imageUploaded = true;
};
img.src = event.target.result;
};
reader.readAsDataURL(file);
}
});
核心逻辑:
Image
对象。800px
,并保持比例缩放。canvas
画布的尺寸与调整后的图片一致。ctx.drawImage(img, 0, 0, newWidth, newHeight);
在 canvas
上绘制图片。当用户在 canvas
上点击时,通过 getImageData()
方法获取该像素的颜色值。
colorPickerCanvas.addEventListener('click', function(e) {
if (!imageUploaded) {
alert('请先上传图片');
return;
}
const x = e.offsetX;
const y = e.offsetY;
// 获取该像素的颜色数据
const pixel = ctx.getImageData(x, y, 1, 1).data;
const r = pixel[0];
const g = pixel[1];
const b = pixel[2];
// 计算 Hex 颜色值
const rgb = `rgb(${r}, ${g}, ${b})`;
const hex = rgbToHex(r, g, b);
// 更新 UI
colorPickerBox.style.backgroundColor = hex;
colorPickerHexCode.textContent = hex;
colorPickerRgbValue.textContent = rgb;
});
核心逻辑:
canvas
的 click
事件,获取鼠标点击的坐标 x, y
(基于 canvas
)。ctx.getImageData(x, y, 1, 1).data
获取该点的像素数据(RGBA)。RGB
值,并转换为 Hex
值。为了兼容更多颜色格式,需要将 RGB 值转换成 Hex 格式:
function rgbToHex(r, g, b) {
return `#${(1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1).toUpperCase()}`;
}
转换逻辑:
1 << 24
确保 24 位整数空间,r << 16 | g << 8 | b
将 RGB
组合为整数。.toString(16)
转换为 16 进制字符串。.slice(1).toUpperCase()
确保颜色值为标准 6 位大写格式。用户可以点击复制按钮,将颜色值复制到剪贴板,并在复制后修改按钮状态。
colorPickerCopyHexBtn.addEventListener('click', function() {
if (!imageUploaded) return;
const hex = colorPickerHexCode.textContent;
navigator.clipboard.writeText(hex).then(function() {
colorPickerCopyHexBtn.textContent = '已复制';
colorPickerCopyHexBtn.classList.add('copied');
setTimeout(() => {
colorPickerCopyHexBtn.textContent = '复制';
colorPickerCopyHexBtn.classList.remove('copied');
}, 2000);
});
});
核心逻辑:
navigator.clipboard.writeText(hex)
复制 Hex 颜色值到剪贴板。当用户在 canvas
上移动鼠标时,显示一个吸管样式的图标,并随着鼠标移动。
colorPickerCanvas.addEventListener('mousemove', function(e) {
if (!imageUploaded) return;
colorPickerIcon.style.left = `${e.pageX - 15}px`;
colorPickerIcon.style.top = `${e.pageY - 15}px`;
colorPickerIcon.style.display = 'block';
});
colorPickerCanvas.addEventListener('mouseleave', function() {
colorPickerIcon.style.display = 'none';
});
核心逻辑:
mousemove
事件时,调整 colorPickerIcon
的 left
和 top
使其跟随鼠标。mouseleave
事件时,隐藏吸管图标。保持图片比例
maxWidth = 800
计算缩放比例,防止图片变形画布尺寸同步
canvas
大小与图片尺寸保持一致,确保颜色采集坐标正确。避免跨域问题
canvas
绘制图片时如果存在跨域问题,需确保图片来源允许 CORS
(本地文件不会有此问题)。鼠标精准吸取颜色
x, y
计算基于 canvas
坐标,而不是 window
或 document
坐标。以上就是图片颜色采集工具的实现原理和核心代码。