8ed626f09ea3a22695939e53bf4b54e86e49cf0ba3663e84e071fcb8d35cd9dbcffff996ef97df4ade517a9dfa65d1ebea5b54fe618d0558033ad2d5bac23e 4.2 KB

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