用JavaScript从img读取EXIF数据(跨域友好)

用JavaScript从img读取EXIF数据(跨域友好),javascript,image,canvas,binary-data,exif,Javascript,Image,Canvas,Binary Data,Exif,我最近开始构建一个bookmarklet,用于显示网站上任何图像的EXIF数据。我选择使用Nihilogic的库。对于与父页面位于同一域中的图像,脚本工作得非常出色。但因为它使用XHR读取图像的二进制数据,而且XHR仅限于同源请求,所以我无法访问任何跨站点托管图像的二进制数据 是否有一种方法可以在本地(或至少不使用XHR)加载保留EXIF数据的图像的二进制数据? 我已经探索了其他几个方向,但我担心我对它们的理解不够,无法确定是否有解决方案: JSONP——我假设没有办法将二进制数据转换到这些东

我最近开始构建一个bookmarklet,用于显示网站上任何图像的EXIF数据。我选择使用Nihilogic的库。对于与父页面位于同一域中的图像,脚本工作得非常出色。但因为它使用XHR读取图像的二进制数据,而且XHR仅限于同源请求,所以我无法访问任何跨站点托管图像的二进制数据

是否有一种方法可以在本地(或至少不使用XHR)加载保留EXIF数据的图像的二进制数据?

我已经探索了其他几个方向,但我担心我对它们的理解不够,无法确定是否有解决方案:

  • JSONP——我假设没有办法将二进制数据转换到这些东西中
  • -这些似乎产生了与PHP非常不同的base64编码,我怀疑新编码中不再存在EXIF数据

是否纯粹来自客户?我对此表示怀疑。如何使用XHR'ing一个运行类似于
exif\u imagetype()
的本地PHP脚本?此功能适用于远程和图像。

允许Javascript对相同来源的图像和启用cors的图像执行特殊操作(如在画布上),因为浏览器可以安全地认为这些图像可以首先上传到服务器。但是事情变得复杂了

我无法访问任何跨站点托管图像的二进制数据

是的,一般来说,你不能这样做是非常重要的。更重要的是,你不能用bookmarklet做你想做的事情

你不能在画布上这样做,因为这里的cors规则很严格

简言之,一般的推理几乎完全相同。浏览器处于一个独特的安全位置:互联网上的随机页面可以向您显示对您来说是私有的东西,例如假设图像C:\MyPhotos\privateImage1.jpg,假设它可以猜到该文件路径

但是,除了向您显示文件外,该网页绝对不允许对该文件进行任何处理。它无法读取二进制信息(EXIF信息或像素信息)。JavaScript不允许知道该图像的外观或与之相关的任何数据

如果能够弄清楚,一个随机网页就可以尝试一组文件路径,可能会在硬盘上遇到一个图像,然后将该图像的二进制数据上传到服务器,实际上窃取了你的私人图像



因此,浏览器扩展比(JavaScript)bookmarklet更适合此任务。

Aha!我当然知道XHR限制的风险,但我没有想到本地的照片数据示例。这完全可以解释为什么图像也是封闭的。不过,有点令人失望的是,我不能完成我作为书签的使命。