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,/gmi, ''); 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