JavaScript吸管(告诉鼠标光标下像素的颜色)

85

我在寻找一个"眼滴"工具,可以在JavaScript中为CMS提供鼠标光标所在像素的十六进制值。

对于Firefox浏览器,有一个名为ColorZilla的扩展能够完美实现这一功能。但它只适用于FF浏览器,我希望能够将其与CMS一同使用。

一位荷兰开发者想到了非常巧妙的方法,使用Ajax和PHP的imagecolorat()来查找图像上的像素颜色。但是,这种方法的局限在于只能针对服务器端能够访问到的图片进行操作,而我真正想要的是一个通用的工具。

我可以使用其中的任一方法,但更希望能够使用跨浏览器、基于JavaScript或Flash的方式,无需进行服务器端调整,也无需安装扩展程序。

如果有任何可在IE中实现类似于ColorZilla的功能的解决方案,我也会感兴趣 - 我可以支持IE和FF浏览器,虽然跨浏览器解决方案当然更理想。


这在Javascript中不可能实现;我不确定Flash是否可以。 - SLaks
理论上,您可能能够处理鼠标光标下面的最顶层元素关联的样式信息,并确定该元素的颜色应该是什么,如果它不是图像或画布的话。但在实践中,这可能会让您发疯,需要处理边框、边距和浏览器怪癖等问题。我认为Elijah的回答是唯一可行的方案。 - Aaronaught
12个回答

3

除了图像或<canvas>,没有内置的DOM方法可以通用地获取DOM元素在特定像素位置的颜色。

因此,为了实现这一点,我们必须使用类似于HTML2CanvasDOM Panda的工具来对我们的网站进行“截屏”,获取用户的点击位置,并获取该特定位置“截屏”中的像素颜色。

使用HTML2Canvas(版本0.5.0-beta3),您可以执行以下操作:

// Take "screenshot" using HTML2Canvas
var screenshotCanvas,
    screenshotCtx,
    timeBetweenRuns = 10,
    lastTime = Date.now();
function getScreenshot() {
    // Limit how soon this can be ran again
    var currTime = Date.now();
    if(currTime - lastTime > timeBetweenRuns) {
        html2canvas(document.body).then(function(canvas) {
            screenshotCanvas = canvas;
            screenshotCtx = screenshotCanvas.getContext('2d');
        });
        lastTime = currTime;
    }
}
setTimeout(function() { // Assure the initial capture is done
    getScreenshot();
}, 100);

// Get the user's click location
document.onclick = function(event) {
    var x = event.pageX,
        y = event.pageY;

    // Look what color the pixel at the screenshot is
    console.log(screenshotCtx.getImageData(x, y, 1, 1).data);
}


// Update the screenshot when the window changes size
window.onresize = getScreenshot;

Demo


这里有一个演示实现以上解决方案的网站:https://jsfiddle.net/8850s/an9f24hp/点击任何地方(甚至是该 div 本身)来设置左上角 div 的 background-color - shreyasm-dev

1

我想在@BorrisTB的回答上添加两个重要考虑因素(以及每个人都指向EyeDropper API的可用性的答案)。

  1. 我们在一个项目上实现了Eyedropper API,该项目在我的机器上顺利运行,但在生产服务器上给我返回“EyeDropper未定义”的错误。结果表明,它需要window.isSecureContext = true。这只可能在本地主机和仅限于HTTPS的情况下发生。因此,请确保页面通过HTTPS加载,以使API可用。
  2. 目前,它仅在基于chromium的浏览器上以及仅在桌面上可用。Mozilla和Safari不支持此功能,并且出于安全原因没有计划支持它。请参阅下表https://developer.mozilla.org/en-US/docs/Web/API/EyeDropper_API#browser_compatibility

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接