安装 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. Select、Poll、Epoll IO复用技术

    简介 目前多进程方式实现的服务器端,一次创建多个工作子进程来给客户端提供服务, 但是创建进程会耗费大量资源,导致系统资源不足 IO复用技术就是让一个进程同时为多个客户端端提供服务 IO复用技术 之 S ...

  2. OpenCV 之 特征检测

    特征,也称 兴趣点 或 关键点,如下:蓝框内区域平坦,无特征:黑框内有"边缘",红框内有"角点",后二者都可视为"特征" 角点作为一种特征, ...

  3. 【LeetCode】98. 验证二叉搜索树

    98. 验证二叉搜索树 知识点:二叉树:递归 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大 ...

  4. SQL Challenges靶机

    http://www.zixem.altervista.org/SQLi/ 第一关 http://www.zixem.altervista.org/SQLi/level1.php?id=1 and 1 ...

  5. Netty 源码分析系列(一)Netty 概述

    前言 关于Netty的学习,最近看了不少有关视频和书籍,也收获不少,希望把我知道的分享给你们,一起加油,一起成长.前面我们对 Java IO.BIO.NIO. AIO进行了分析,相关文章链接如下: 深 ...

  6. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)

    更多精彩内容请关注微信公众号:新猿技术生态圈 更多精彩内容请关注微信公众号:新猿技术生态圈 更多精彩内容请关注微信公众号:新猿技术生态圈 Endpoints 命名空间级资源,如果endpoints和s ...

  7. 在Windows中安装PySpark环境

    在Windows中安装PySpark环境 安装Python 可以选择安装官方版本的Python,或是Anaconda,对应的地址如下. 下载地址 Python:https://www.python.o ...

  8. 接口管理效率神器Apifox

    前言 你是一个测试,你们团队目前开发模式是前后端分离. 某一天,版本V1.0接口评审完,发布在了swagger上,前后端各自进行开发.此时你根据接口文档将新接口迁移到JMeter上,然后开始编写接口测 ...

  9. 我,Android开发5年,32岁失业,现实给我狠狠上了一课!

    如今的职场,风险是越来越高,不管你是应届生或者你是否中年,遇到好点的企业,红火那么做个三五年,运气不好,半年甚至2.3个月也就玩完了. 所以,即使你希望工作能稳定,但也会让你大失所望,职场寿命就那么几 ...

  10. Java时间类从此变得清晰明了

    Java时间类 Java时间类分为Date 日期类和Calendar 日历类,相信很多小伙伴在初学时会对这个两个类的用法.区别以及有什么联系会感到疑惑,似乎懂了,但又不能具体说清,今天再带你来清晰的再 ...