JS - 检测来自其他域的图像亮度



我在文档中加载了一个图像<img src="https://www.someotherdomain.com/myimg.jpg">,我想使用 JS 来确定图像的平均"亮度"(调整叠加元素的颜色以提高可见性。

答案在这里:图像暗/亮检测客户端脚本工作得很好...除了它不适用于跨源资源的事实。我需要确定亮度的图像可能来自任何域,并且我无法控制在服务器上设置必要的 CORS 标头以与响应一起传回以使 JS 轻松使用图像。

有没有办法从外部域获取图像的亮度而不必担心 CORS?

不是直接的:未通过 CORS(具有crossorigin属性)加载的跨域图像被视为"污染",并且绘制的任何地方(例如在画布上)也会受到污染。您无法从受污染的画布中读取图像数据,这就是链接答案中描述的方法(使用getImageData读取图像数据)不起作用的原因。MDN有一些关于受污染图像的更多信息。

这背后的原因与任何其他受 CORS 限制的资源相同:未经其他域的明确许可(通过使用 CORS 标头),您不应能够从其他域获取信息,因为远程域可能从未打算由其他域访问此类图像。

例如,图像共享服务可能只允许登录用户访问私有图像;如果不存在此限制,任何具有此类图像URL的网站都可以以登录用户的身份请求该图像,然后读取图像,将其上传并发布在自己的网站上,这绝对是一个隐私问题。

可以使用CORS 代理解决此问题,该代理通过自动添加 CORS 标头的服务器路由请求。您可以使用公共服务,例如 crossorigin.me(您只需在 URL 之前添加https://crossorigin.me/),或者如果您不习惯通过未知第三方发送请求,则可以运行自己的 CORS 代理。