【发布时间】:2014-12-01 12:24:41
【问题描述】:
我需要访问页面上已加载的图像中的EXIF 数据。说,从浏览器扩展。 AFAIU,有一些 javascript 方法可以完成任务:
- 使用JavaScript-Load-Image;
- 使用Nihologic EXIF manipulation library;
- 在画布上绘制图像。
前两种方法要么处理本地文件,要么需要向服务器执行额外的(在这种情况下是多余的)请求以检索二进制数据。后者可能有效:
var canvas = document.createElement("canvas");
canvas.width = oImg.width;
canvas.height = oImg.height;
// Copy the image contents to the canvas
var ctx = canvas.getContext("2d");
ctx.drawImage(oImg, 0, 0);
// Get the data-URL formatted image
var dataURL = window.atob(canvas.toDataURL("image/jpeg", 1.0).split(',')[1]);
但生成的二进制对象不包含 EXIF 数据(0xE1 标记,)似乎一旦在画布上绘制,它就会产生 JFIF(0xE0)标记。
所以,我的问题是:是否可以访问页面上已加载图像的二进制数据?
请注意:SO 上已经有similar questions,但没有人回答如何不重新加载图像并访问 EXIF 数据的问题。
我知道我可以在本地将图像保存到 LocalStorage 中,然后使用上面提到的库,但它看起来也有点矫枉过正。
【问题讨论】:
-
不使用canvas就无法获取EXIF数据客户端,并且canvas受同源策略约束,只能加载本地图像,因此不使用任何一个都无法完成服务器端获取图像,或以某种方式在客户端存储图像以避免同源策略。
-
我怀疑这一点,但这有点奇怪,因为我总是有机会存储图像和/或重新请求它作为二进制资源。可惜了。
-
为什么不直接使用 github.com/jseidelin/exif-js 之类的东西?
-
我不明白为什么您的浏览器扩展不能向服务器发出额外的请求以检索二进制数据?因为只有这样才能得到带有EXIF数据的二进制数据!你的扩展是离线还是什么?
标签: javascript image canvas exif