安装 exif.js

npm install exif-js --save

UI

<button type="primary" @click="onExif">get exif data</button>

javascript

import EXIF from 'exif-js'

const MB = 1024 * 1024
const sizeLimit = 20 * MB function chooseImage (count = 9) {
return new Promise((resolve, reject) => {
wx.chooseImage({
count,
sizeType: ['original'],
sourceType: ['album', 'camera'],
success: res => {
res.tempFiles.every((v, i) => {
let {size} = v
if (size > sizeLimit) { reject(new Error(`图片大小应小于 ${sizeLimit}MB`)); return false }
return true
})
resolve(res.tempFiles)
},
fail: e => {
reject(e)
}
})
})
} async onExif (e) {
const res = await chooseImage().catch(console.error)
if (!res) return
const filePath = res[0].path
wx.getFileSystemManager().readFile({
filePath,
success: res => {
EXIF.getData(res.data, img => console.print('img:', img))
const strPretty = EXIF.pretty(res.data)
console.log('strPretty:', strPretty)
}
})
}

直接用会报错:

VM5701:1 thirdScriptError
Cannot read property 'Image' of undefined;at api readFile success callback function
TypeError: Cannot read property 'Image' of undefined
at Function.global.webpackJsonpMpvue.EXIF.getData (http://127.0.0.1:44195/appservice/common/vendor.js:39035:20)
at success (http://127.0.0.1:44195/appservice/pages/fuck/main.js:588:82)
at MC (WAService.js:1:1091186)
at Function.success (WAService.js:1:1092853)
at Object.success (WAService.js:1:102995)
at r (WAService.js:1:433765)
at WAService.js:1:433947
at v (WAService.js:1:433951)
at WAService.js:1:435359
at t.<anonymous> (http://127.0.0.1:44195/appservice/__dev__/asdebug.js:1:11915)

报错代码段:

    EXIF.getData = function(img, callback) {
if (((self.Image && img instanceof self.Image)
|| (self.HTMLImageElement && img instanceof self.HTMLImageElement))
&& !img.complete)
return false; if (!imageHasData(img)) {
getImageData(img, callback);
} else {
if (callback) {
callback.call(img);
}
}
return true;
}

self 是 undefined, 小程序中没有这个东西,这个 if 判断不重要,我们需要的是让跑到 getImageData(img, callback)

直接删掉这个 if,或者在文件开头添加 var self = window || this;

(function() {

    var debug = false;

    var root = this;
var self = window || this; var EXIF = function(obj) {
if (obj instanceof EXIF) return obj;
if (!(this instanceof EXIF)) return new EXIF(obj);
this.EXIFwrapped = obj;
};

这下不报错了,可是控制台输出 strPretty 为空,啥也没有啊,EXIF.getData(res.data, img => console.print('img:', img)) 这里的 callbak 也没调到

看逻辑是 getImageData 没有调 callback

我们传入的 img 是一个 ArrayBuffer,所以这函数中的两个 if 都没进去,需要再加个 else if

else if (img instanceof ArrayBuffer) {
handleBinaryFile(img)
}

运行小程序,发现又报错了

VM6043:1 thirdScriptError
Blob is not defined;at api readFile success callback function
ReferenceError: Blob is not defined
at readThumbnailImage (http://127.0.0.1:44195/appservice/common/vendor.js:38781:49)
at readEXIFData (http://127.0.0.1:44195/appservice/common/vendor.js:38898:29)
at findEXIFinJPEG (http://127.0.0.1:44195/appservice/common/vendor.js:38510:24)
at handleBinaryFile (http://127.0.0.1:44195/appservice/common/vendor.js:38429:24)
at getImageData (http://127.0.0.1:44195/appservice/common/vendor.js:38478:13)
at Function.global.webpackJsonpMpvue.EXIF.getData (http://127.0.0.1:44195/appservice/common/vendor.js:39044:13)
at success (http://127.0.0.1:44195/appservice/pages/fuck/main.js:588:82)
at MC (WAService.js:1:1091186)
at Function.success (WAService.js:1:1092853)
at Object.success (WAService.js:1:102995)

没有 Blob,在文件头加上 var Blob = Blob || function () {}, 再次执行,输出结果,搞定!

修改后的 exif.js 代码

这个小程序可以查看照片的EXIF元信息:

------------------ 2021.4.30 更新 ----------------

exif 页面可以正常访问了

------------------ 2021.4.6 更新 ----------------

因为 mpvue 很久没维护了,所以最近对我的小程序代码进行了重写,不再使用任何现成的框架。

目前 exif 页面暂时无法访问

小程序 读取照片 EXIF 元信息的更多相关文章

  1. 利用Python读取图片exif敏感信息

    众所周知,现在很多的照相机等软件,拍摄会有选项,是否包含位置信息等. 当然有的人会说,我在微信中查看图片exif信息并没有啊,这是因为你发送到微信服务器的时候,微信帮你完成了保密工作. 常见的图片中包 ...

  2. Java springboot支付宝小程序授权,获取用户信息,支付及回调

    参考官方文档https://opendocs.alipay.com/mini/introduce/pay 支付宝小程序的支付和微信小程序的支付一样第一步都是要获取到用户的唯一标识,在微信中我们获取到的 ...

  3. java 后台解密小程序前端传过来的信息,解密手机号

    package com.llny.controller; import com.google.gson.Gson; import com.google.gson.JsonObject; import ...

  4. 微信小程序授权获取用户详细信息openid

    小程序获取用户的头像昵称openid之类 第一种使用wx.getUserInfo直接获取微信头像,昵称 wx.getUserInfo({ success: function (res) { that. ...

  5. 小程序wx.getUserInfo获取用户信息方案介绍

    问题模块 框架类型 问题类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本 API和组件 - -   - -     背景 小程序一个比较重要的能力就是获取用户信息,也就是使用 wx.g ...

  6. 小程序登录&授权&获取用户信息

    一 .登录 时序图如下: wx.login() 获取js_code 示例代码: App({   onLaunch: function() {     wx.login({       success: ...

  7. 统一微信公众号、小程序、APP的用户信息

     上次接手一个项目需要整合公众号.小程序以及APP的用户,查阅了微信文档以及一些作者的文章,中间踩了不少坑,在此记录一下解决的流程. 要点  实现统一信息的有以下几点:  1. 在微信开放平台绑定需要 ...

  8. [小程序]微信小程序登陆并获取用户信息

    1.小程序js端调用框架登陆API,获取到一个临时code,拿着这个code去调用自己的服务端接口 2.在自己的服务器端,使用app_id app_secrect code可以获取到用户的openid ...

  9. uni-app开发经验分享二十: 微信小程序 授权登录 获取详细信息 获取手机号

    授权页面 因为微信小程序提供的 权限弹窗 只能通用户确认授权 所以可以 写一个授权页面,让用户点击 来获取用户相关信息 然后再配合后台就可以完成登录 <button class="bt ...

随机推荐

  1. 第十七篇 -- QTreeWidget与QDockWidget

    效果图: 目录和工具条的创建在前面几节就已经学过了,所以目录和工具条的布局可以自己画. 那么下面的部分,左侧是一个DockWidget,里面放置一个TreeWidget.右边是一个ScrollArea ...

  2. django2.1实现全文检索(最详细)+遇到的坑+jieba分词

    首先django实现全文检索在这里使用的是haystack,环境是django2.1+win10 64+py3.7 1: 安装包: pip install dgango-haystack #安装全局检 ...

  3. Django中F对象,Q对象与运算符

    在Django的模型中F对象与Q对象比较常用的,所以单独说一下: F对象 F对象位于django.dc.models模板下,使用的时候记得首先导入!!! 作用:F对象主要用于当模型的字段A与字段B进行 ...

  4. 键盘和鼠标闲置超时时关闭显示器并锁定电脑桌面的AutoHotkey脚本 2019年11月24日写

    /* 键盘和鼠标闲置超时时关闭显示器并锁定电脑桌面的AutoHotkey脚本 2019年11月24日写 在电脑桌面锁定时移动鼠标就会显示登录界面,此时即使超过电源设置的时间电脑也不会关闭显示器使得屏幕 ...

  5. Centos忘记密码怎么修改

    使用Centos系统忘记密码 在我们日常使用Centos系统时,有些人不免会出现一个共同的问题:忘记登录密码! 我们总不能再重装一遍吧! 接下来我们就分两种情况来看看: Centos系统在云服务器 C ...

  6. 洛谷P1880题解

    题目 第一类区间DP模板题. 所谓第一类区间DP,是指合并型区间DP,状态转移方程一般形如 \(f_{i,j}=\max{f_{i,k}+f_{k+1,j}+cost_{i,j}}\) ,时间复杂度一 ...

  7. Salesforce Integration 概览(五) Remote Call-In(远程操作 外部->salesforce)

    本篇参考:https://resources.docs.salesforce.com/sfdc/pdf/integration_patterns_and_practices.pdf 本篇博客介绍 Re ...

  8. React脚手架配置代理

    react脚手架配置代理 方法一 在package.json中追加如下配置 "proxy":"http://localhost:5000" 说明: 优点:配置简 ...

  9. CMMI相关图书

    Integrating CMMI and Agile Development: Case Studies and Proven Techniques for Faster Performance Im ...

  10. MaterialDesign Or ComboBox 联动查询

    <ComboBox Width="200" Height="30" x:Name="ComboxName" Text="{B ...