html5 判断图片 exif,前端获取图片 exif 流信息

如果你是为了获取 exif 解析后的信息,那么你可以看这篇 前端获取图片exif信息,通过 exif-js 来获取的。

看到这里你要懵逼了,我为什么又要写一遍。emmmm...因为我需求变了,直接拿到 exif 部分的数据,然后 base64 提交。(giao) 测试地址

什么是 exif

可交换图像文件格式(英语:Exchangeable image file format,官方简称 Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。

exif 格式规则

Exif 信息以 0xFFE1 作为开头标记,后两个字节表示 Exif 信息的长度。所以 Exif 信息最大为64 kb,而内部采用 TIFF 格式。

基于这样的规则,那其实我要获取 exif 信息的串就很简单了。

伪代码实现,反正跑不起来

// 获取开始标记

ffe1_idx = blob.indexOf('ffe1');

// 截取后两个字节,用来当长度

exifLength = blob.slice(ffe1_idx, ffe1_idx + 2)

// 截取出exif

exif = blob.slice(ffe1_idx, ffe1_idx + exifLength)

// exif 处理成 base64

btoa(exif)

实现获取 exif 并 base64 编码

我是基于 exif.js,使用了他内部的错误控制。

判断类型

因为 exif 是用于记录数码照片的属性信息和拍摄数据,所以需要是 JPEG

if ((dataView.getUint8(0) != 0xFF) ||

(dataView.getUint8(1) != 0xD8)) {

console.log("Not a valid JPEG");

return {

state: 1001,

message: 'not a valid jpeg'

};

}

查找 Exif 的标志位

bVbGIYO

前面我们介绍了 Exif 信息以 0xFFE1 作为开头标记。

所以我们直接找这个信息

bVbGIYY

将 arrayBuffer 数据以 Uint8 解析并展示 Array.from(new Uint8Array(temp1)).map(v=>[v, v.toString(16).padStart(2, '0'), String.fromCharCode(v)])

var offset = 2, //头两位是类型标记所以跳过

length = file.byteLength, //文件长度

marker;

while (offset < length) {

if (dataView.getUint8(offset) != 0xFF) {

if (debug) console.log("Not a valid marker at offset " + offset + ", found: " + dataView.getUint8(offset));

return { state: 1002, message: 'not a valid marker, something is wrong' };

}

marker = dataView.getUint8(offset + 1);

if (debug) console.log(marker);

if (marker == 225) {

if (debug) console.log("Found 0xFFE1 marker");

return readEXIFData(

dataView, // 数据源

offset + 4 //跳过 0xffe1 和 长度位

} else {

offset += 2 + dataView.getUint16(offset + 2);

}

}

解析 exif

function readEXIFData(file, start) {

// 判断是不是 exif 信息,开头应该是字符串 Exif

if (getStringFromDB(file, start, 4) != "Exif") {

if (debug) console.log("Not valid EXIF data! " + getStringFromDB(file, start, 4));

return { state: 1003, message: "Not valid EXIF data! " + getStringFromDB(file, start, 4) };

}

// 判断是大数结尾还是小数结尾。

var bigEnd,

tiffOffset = start + 6;

if (file.getUint16(tiffOffset) == 0x4949) {

bigEnd = false;

} else if (file.getUint16(tiffOffset) == 0x4D4D) {

bigEnd = true;

} else {

if (debug) console.log("Not valid TIFF data! (no 0x4949 or 0x4D4D)");

return { state: 1004, message: "Not valid TIFF data! (no 0x4949 or 0x4D4D)" };

}

if (file.getUint16(tiffOffset + 2, !bigEnd) != 0x002A) {

if (debug) console.log("Not valid TIFF data! (no 0x002A)");

return { state: 1005, message: "Not valid TIFF data! (no 0x002A)" };

}

var firstIFDOffset = file.getUint32(tiffOffset + 4, !bigEnd);

if (firstIFDOffset < 0x00000008) {

if (debug) console.log("Not valid TIFF data! (First offset less than 8)", file.getUint32(tiffOffset + 4, !bigEnd));

return { state: 1006, message: "Not valid TIFF data! (First offset less than 8)" };

}

// 截取,这里代码讲道理还是可以优化的。

var _start = tiffOffset - 10;

var _end = parseInt(Array.from(new Uint8Array(file.buffer.slice(start-2,start))).map(v=>v.toString(16)).join(''), 16)+start-2

return {

state: 1000,

data: btoa(Array.from(new Uint8Array(file.buffer.slice(_start, _end))).map(v => String.fromCharCode(v)).join(''))

}

}

bVbGIZC

微信公众号:前端linong

欢迎大家关注我的公众号。有疑问也可以加我的微信前端交流群。

快速访问您查看的任何图像的EXIF数据 快速访问您在Google Chrome浏览器中查看的任何图像的EXIF数据如何使用它? -右键单击任何图像/图片-选择“显示Exif数据”-然后在浏览器右侧的单独面板中显示图像/ exif信息。 顶级功能:-完全免费-只需单击鼠标右键即可获得各种信息-预览图像详细信息-支持300多个摄像头-直方图或RGB颜色重构-将exif信息自动复制到剪贴板-共享重要更新的通知-其他功能即将推出…-99%的网站不受影响。 帮助我们解决任何问题-无需注册或登录要测试什么? 在http://bit.ly/2cOdqNT上尝试这些图片http://bit.ly/2cOcvNN、http://bit.ly/2cOdD3E及更多内容权限:-此应用需要读取权限才能提供一些高级功能功能。 *没有广告软件。 没有间谍软件。 别吵了。 支持链接:http://tiny.cc/extsupport ==========当前问题========== 1.破坏了一些网站吗? -任何导入了一些(require-js)javascript的网站都可能会受到影响-解决方案:2016年10月17日,我们对其进行了修复,希望它可以解决所有问题2。PDF未打开-以.pdf结尾的所有网址均已修复-像来自Drive的蒸出的PDF文件不受影响-其他格式的PDF可以在此处进行验证-http://bit.ly/2d8lStp-如果有任何问题,请在http://tiny.cc/extsupport上共享详细信息/链接。3. CSS破解某些网站-我们已于2016年9月21日修复此问题,希望它不会破解任何新CSS其他问题? 请在http://tiny.cc/extsupport上报告它们。===============常见问题解答=============== 1.某些网站为何崩溃? -由于此扩展程序需要某些(jQuery)库才能工作,并且可能与网站的导入相互冲突。2.是否注入/ css? -是的,因为它是一个集成的扩展,需要直接从浏览器DOM处理内容-它仅注入提供EXIF数据功能所需的脚本/ css ============更改日志== ========== 2.4.1-现在支持大多数PDF格式而不会中断-固定/覆盖加载图像的问题已得到修复-网站中断的问题(很少)现在终于得到了修复2.4.0-修复了该问题CSS规则破坏了一些网站-增加了内容空间2.3.8 / 9-UI增强2.3.7-修复了曾经破坏两个网站的require-jquery.js问题2.3.6-PDF问题不可复制,请在此处进行验证-http://bit.ly/2d8lStp,并在http://tiny.cc/extsupport上报告任何问题2.3.5-修复了缺少的相机图片细节2.3.4-改进了外观-通知支持-修复了PDF开放性问题(Ref-http://prntscr.com/cj3h7i)2.2-更新了摄像头模型-添加了新的exif属性2.1-UI更新-附加验证2.0-直方图支持-错误 修复-复制到剪贴板选项1.5。*-额外的相机支持1. *-基本的exif信息显示需要快速帮助吗? 通过-http://tiny.cc/extsupport与我们联系 支持语言:English,Français,Tiếng Việt,Ελληνικά,русский,中文 (繁體)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值