| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 当程序员遇到会写代码的产品经理...... -> 正文阅读 |
|
[移动开发]当程序员遇到会写代码的产品经理...... |
1、缘起事情是这样的,上周我接到了个需求,产品经理想在微信内嵌的H5里,静默获取图片的详细信息,比如拍照的时间、地理位置、设备指纹等。 这个需求做不了。 原以为事情到这里就结束了,万万没想到,我遇到了一个会写代码的产品经理… 第二天早上,我的直属技术领导直接找到了我,和我说: “xxx(产品经理)”把获取图片信息的Demo写出来了,这个需求可以做,之后就你来吧。 当时我的内心是这样的: 拿错了拿错了: 总之,最后这个需求还是落到我头上了。 所以就有了这篇:获取图片的Exif数据。 2、正文开始像这种附带拍摄时间、GPS地理位置等信息的图片格式叫做Exif,英文全称为 之前有一阵子传得沸沸扬扬的微信上传原图会泄漏隐私数据的事儿,其实就是这个Exif的锅。。。实际上这些Exif数据是由拍照设备产生的,并且用户可以自行修改和删除,换句话说,你可以随便修改Exif数据。比如这样: 当然,微信上传原图确实会有风险,因为一不小心你就告诉了别人你是在哪里拍的这张照片,但是这个事不能全赖微信,理论上所有上传图片的程序都有泄漏隐私的风险。你可以像上面说的那样直接改数据,也可以点左下角的删除属性和个人信息来直接删除Exif数据: 因为Exif数据是可以伪造和删除的,所以理论上只能作为参考,而不能当作确切信息。 那么,如何获取Exif数据呢? github上有个4.1k star的开源项目exif-js:https://github.com/exif-js/exif-js 用起来很丝滑,我写了个Demo来获取图片的Exif数据: 随便找张手机拍的照片上传看看: 可以看到已经获取到了图片的Exif数据,并且通过百度地图API反查出了具体的地址。 但是对于非设备直接拍照的图片,或者图片经过了压缩处理,比如你从网上直接下载下来的图片等,可能就拿不到Exif数据。 作为一个有追求的前端, 所以,去看看exif-js的源码:
呵,区区一千多行,话不多说,就是肝。 以下是源码分析。 分析比较长,可以不看 直接拉到最后给我点个赞 😃 首先是个匿名自执行函数,这样写的好处是能拥有独立作用域,既避免污染外界代码,也避免被外界代码污染。 接着定义并导出 这里检查了当前环境的模块化规范, EXIF上定义了很多属性和方法,比如我们demo里用到的
可以看到入参是img对象和callback回调函数,如果img对象上有exifdata属性值,则直接调用callback,如果没有,则需要调一个方法去获取: 因为图片有可能是我们通过src属性定义的,也有可能是本地上传的,而src属性值有可能是base64格式,也可能是blob或http/https等格式,所以getImageData会对不同情况的图片对象进行处理,最后都处理为
上述的几个对象实际上都是JS提供的处理二进制数据的对象,如果想进一步了解,推荐阅读这篇文章:《聊聊JS的二进制家族:Blob、ArrayBuffer和Buffer》:https://zhuanlan.zhihu.com/p/97768916 我们继续看源码: 拿到
这里有个前置知识点:Exif信息以0xFFE1作为开头标记,所以源码中的这段while遍历就是为了找到Exif信息串的开头,然后再调用
除了Exif数据,源码中还解析了IPTC数据(作者,版权,字幕,细节描述等)、XMP数据(Extensible Metadata Platform,Adobe公司提出的关于元数据的创建、处理和交换的一套标准)。 扩展资料exif-js的API、属性等使用说明可以参考这篇博客:http://code.ciaoca.com/javascript/exif-js/ 产品经理还有一个获取设备指纹的需求,因篇幅所限,就下次再写吧,这里给出Demo:http://jsrun.net/2wTKp/edit,用的是 3、总结作为一个秃头程序员,身处和谐社会,我积极反思了一下自己,实际上不能直接和产品经理说“这个需求做不了”。如果真的做不了,应该给出具体的技术可行性分析,再得出做不了的结论,否则就应该说:“我去看下可行性”,然后去仔细了解下技术实现上的难点,再和产品经理沟通说明。 总而言之就是: 不能直接说“这个需求做不了”。 以上都是废话,大家看看就好。 本文的重点其实还是中间那段获取Exif数据的分析。 闲扯两句中秋快到啦,我的老家最近疫情又严重了,所以回不了家,只能中秋的时候一起云赏月云吃饼了~~希望疫情能早日结束吧。 提前祝大家中秋节快乐,团团圆圆,幸福美满! |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 20:24:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |