安装 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. 深入刨析tomcat 之---第10篇 how tomcat works 第13章,Response 发送错误信息 sendError

    writedby 张艳涛 在浏览器中发送一个错误应用url 那么tomcat是如何发送错误的呢? 基本上是发送http 的response协议,分为两部分一部分是response设置头信息, 那么先分 ...

  2. dio框架访问云函数参数传递问题(以腾讯云中的云函数为例子)第一部

    dd云函数其实比较普及,这里以腾讯云的云函数为例,传递参数完成简单的账号注册. 一.第一步先注册腾讯云账号,这里不过多阐述,接着点击 控制台 进入开发者界面.(注意提前进行实名认证) 二.开发者界面如 ...

  3. Windows内核开发-5-(2)-内核模式调试

    Windows内核开发-5-(2)-内核模式调试 普通用户模式的调试,采取的是给进程添加一个线程来挂起断点,作为一个调试器的线程在进程中使用.照这样来类推,对操作系统调试相当于添加一个进程来限制操作系 ...

  4. 多线程案例:龟兔赛跑-Race

    多线程案例:龟兔赛跑-Race 前置条件: 首先来个赛道距离,然后要离终点越来越近 判断比赛是否结束 打印出胜利者 龟兔赛跑开始 故事中是乌龟赢了,兔子需要睡觉,所以我们来模拟兔子睡觉 乌龟赢得比赛 ...

  5. Use Emacs as Personal Knowledge Base

    http://stackoverflow.com/questions/2014636/how-to-maintain-an-emacs-based-knowledge-base

  6. Haskell Interactive Development in Emacs

    Installation Following haskell-mode. Use MELPA repository: add the following into ~/.emacs (require ...

  7. Devcpp(Dev-C++)代码编辑的快捷键

    转自:https://blog.csdn.net/u010940020/article/details/43735549 这里记录一些个人使用Devcpp时,摸索出来的代码编辑快捷键,感觉非常有用.如 ...

  8. 用python 30行代码,搞定一个简单截图调取的百度识字功能

    在做一个数据标注过程中人工需要识别文字. 想了想写了一个小脚本, 大致过程这样的. 截图功能写了好久也没写明白,索性直接调用第三方的截图工具了,在采用qq或者微信截图时,截图完成后保存大致保存在剪切板 ...

  9. [11 Go语言基础-可变参数函数]

    [11 Go语言基础-可变参数函数] 可变参数函数 什么是可变参数函数 可变参数函数是一种参数个数可变的函数. 语法 如果函数最后一个参数被记作 ...T ,这时函数可以接受任意个 T 类型参数作为最 ...

  10. S3C2440—4.时钟系统

    文章目录 一.S3C2440时钟体系介绍 1.总线与时钟 2.时钟来源 3.选择时钟 4.产生时钟 5.流程 二.如何配置时钟源 1.设置FCLK频率寄存器 MPLLCON 2.设置分频HDIV.PD ...