exif-js-min.js
4.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/* eslint-disable */
const Exif = {}
Exif.getData = img =>
new Promise((reslove, reject) => {
let obj = {}
getImageData(img)
.then(data => {
obj.arrayBuffer = data
obj.orientation = getOrientation(data)
reslove(obj)
})
.catch(error => {
reject(error)
})
})
// 这里的获取exif要将图片转ArrayBuffer对象,这里假设获取了图片的baes64
// 步骤一
// base64转ArrayBuffer对象
function getImageData(img) {
let data = null
return new Promise((reslove, reject) => {
if (img.src) {
if (/^data\:/i.test(img.src)) {
// Data URI
data = base64ToArrayBuffer(img.src)
reslove(data)
} else if (/^blob\:/i.test(img.src)) {
// Object URL
var fileReader = new FileReader()
fileReader.onload = function(e) {
data = e.target.result
reslove(data)
}
objectURLToBlob(img.src, function(blob) {
fileReader.readAsArrayBuffer(blob)
})
} else {
var http = new XMLHttpRequest()
http.onload = function() {
if (this.status == 200 || this.status === 0) {
data = http.response
reslove(data)
} else {
throw 'Could not load image'
}
http = null
}
http.open('GET', img.src, true)
http.responseType = 'arraybuffer'
http.send(null)
}
} else {
reject('img error')
}
})
}
function objectURLToBlob(url, callback) {
var http = new XMLHttpRequest()
http.open('GET', url, true)
http.responseType = 'blob'
http.onload = function(e) {
if (this.status == 200 || this.status === 0) {
callback(this.response)
}
}
http.send()
}
function base64ToArrayBuffer(base64) {
base64 = base64.replace(/^data\:([^\;]+)\;base64,/gim, '')
var binary = atob(base64)
var len = binary.length
var buffer = new ArrayBuffer(len)
var view = new Uint8Array(buffer)
for (var i = 0; i < len; i++) {
view[i] = binary.charCodeAt(i)
}
return buffer
}
// 步骤二,Unicode码转字符串
// ArrayBuffer对象 Unicode码转字符串
function getStringFromCharCode(dataView, start, length) {
var str = ''
var i
for (i = start, length += start; i < length; i++) {
str += String.fromCharCode(dataView.getUint8(i))
}
return str
}
// 步骤三,获取jpg图片的exif的角度(在ios体现最明显)
function getOrientation(arrayBuffer) {
var dataView = new DataView(arrayBuffer)
var length = dataView.byteLength
var orientation
var exifIDCode
var tiffOffset
var firstIFDOffset
var littleEndian
var endianness
var app1Start
var ifdStart
var offset
var i
// Only handle JPEG image (start by 0xFFD8)
if (dataView.getUint8(0) === 0xff && dataView.getUint8(1) === 0xd8) {
offset = 2
while (offset < length) {
if (
dataView.getUint8(offset) === 0xff &&
dataView.getUint8(offset + 1) === 0xe1
) {
app1Start = offset
break
}
offset++
}
}
if (app1Start) {
exifIDCode = app1Start + 4
tiffOffset = app1Start + 10
if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {
endianness = dataView.getUint16(tiffOffset)
littleEndian = endianness === 0x4949
if (littleEndian || endianness === 0x4d4d /* bigEndian */) {
if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002a) {
firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian)
if (firstIFDOffset >= 0x00000008) {
ifdStart = tiffOffset + firstIFDOffset
}
}
}
}
}
if (ifdStart) {
length = dataView.getUint16(ifdStart, littleEndian)
for (i = 0; i < length; i++) {
offset = ifdStart + i * 12 + 2
if (
dataView.getUint16(offset, littleEndian) === 0x0112 /* Orientation */
) {
// 8 is the offset of the current tag's value
offset += 8
// Get the original orientation value
orientation = dataView.getUint16(offset, littleEndian)
// Override the orientation with its default value for Safari (#120)
// if (IS_SAFARI_OR_UIWEBVIEW) {
// dataView.setUint16(offset, 1, littleEndian);
// }
break
}
}
}
return orientation
}
export default Exif