123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- 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
|