blob/html/input.jsView |
---|
8 | 8 … | var Defer = require('pull-defer') |
9 | 9 … | var BoxStream = require('pull-box-stream') |
10 | 10 … | var crypto = require('crypto') |
11 | 11 … | var zeros = Buffer.alloc(24, 0) |
| 12 … | +var piexif = require('piexifjs') |
12 | 13 … | |
13 | 14 … | module.exports = { |
14 | 15 … | needs: nest({ |
15 | 16 … | 'sbot.obs.connection': 'first' |
16 | | - |
17 | 17 … | }), |
18 | 18 … | gives: nest('blob.html.input'), |
19 | 19 … | create: function (api) { |
20 | 20 … | return nest('blob.html.input', function FileInput (onAdded, opts = {}) { |
27 | 27 … | |
28 | 28 … | var mimeType = mime(file.name) |
29 | 29 … | var fileName = file.name |
30 | 30 … | |
31 | | - |
32 | | - getOrientation(file, (orientation) => { |
| 31 … | + getFileData(file, function(fileData) { |
| 32 … | + var orientation = getOrientation(fileData) |
| 33 … | + |
| 34 … | + if (opts.removeExif) |
| 35 … | + fileData = removeExif(fileData, orientation) |
| 36 … | + |
| 37 … | + |
33 | 38 … | if (orientation >= 3 || opts.resize) { |
34 | | - getImage(file, (image) => { |
| 39 … | + getImage(fileData, (image) => { |
35 | 40 … | image = rotate(image, orientation) |
36 | 41 … | if (opts.resize) { |
37 | 42 … | image = resize(image, opts.resize.width, opts.resize.height) |
38 | 43 … | } |
43 | 48 … | image.toBlob(blob => { |
44 | 49 … | next(blob) |
45 | 50 … | }, mimeType, 0.85) |
46 | 51 … | } else { |
47 | | - next(file) |
| 52 … | + next(dataURItoBlob(fileData)) |
48 | 53 … | } |
49 | 54 … | }) |
50 | 55 … | } else { |
51 | 56 … | |
52 | | - next(file) |
| 57 … | + next(dataURItoBlob(fileData)) |
53 | 58 … | } |
54 | 59 … | }) |
55 | 60 … | |
| 61 … | + function dataURItoBlob(dataURI) { |
| 62 … | + var byteString = atob(dataURI.split(',')[1]); |
| 63 … | + var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0] |
| 64 … | + var ab = new ArrayBuffer(byteString.length); |
| 65 … | + var ia = new Uint8Array(ab); |
| 66 … | + for (var i = 0; i < byteString.length; i++) { |
| 67 … | + ia[i] = byteString.charCodeAt(i); |
| 68 … | + } |
| 69 … | + return new Blob([ab], {type: mimeString}); |
| 70 … | + } |
| 71 … | + |
56 | 72 … | function next (file) { |
57 | 73 … | var reader = new global.FileReader() |
58 | 74 … | reader.onload = function () { |
59 | 75 … | var stream = pull.values(split(new Buffer(reader.result), 64 * 1024)) |
82 | 98 … | |
83 | 99 … | function getImage (file, cb) { |
84 | 100 … | var image = document.createElement('img') |
85 | 101 … | image.onload = () => cb(image) |
86 | | - image.src = global.URL.createObjectURL(file) |
| 102 … | + image.src = file |
87 | 103 … | image.style.display = 'block' |
88 | 104 … | if (image.complete) cb(image) |
89 | 105 … | } |
90 | 106 … | |
110 | 126 … | ctx.drawImage(image, -offsetX, -offsetY, finalWidth, finalHeight) |
111 | 127 … | return canvas |
112 | 128 … | } |
113 | 129 … | |
114 | | -function getOrientation (file, callback) { |
| 130 … | +function getFileData(file, cb) |
| 131 … | +{ |
115 | 132 … | var reader = new global.FileReader() |
116 | 133 … | reader.onload = function (e) { |
117 | | - var view = new DataView(e.target.result) |
118 | | - if (view.getUint16(0, false) !== 0xFFD8) return callback(-2) |
119 | | - var length = view.byteLength |
120 | | - var offset = 2 |
121 | | - while (offset < length) { |
122 | | - var marker = view.getUint16(offset, false) |
123 | | - offset += 2 |
124 | | - if (marker === 0xFFE1) { |
125 | | - if (view.getUint32(offset += 2, false) !== 0x45786966) return callback(-1) |
126 | | - var little = view.getUint16(offset += 6, false) === 0x4949 |
127 | | - offset += view.getUint32(offset + 4, little) |
128 | | - var tags = view.getUint16(offset, little) |
129 | | - offset += 2 |
130 | | - for (var i = 0; i < tags; i++) { |
131 | | - if (view.getUint16(offset + (i * 12), little) === 0x0112) { |
132 | | - return callback(view.getUint16(offset + (i * 12) + 8, little)) |
133 | | - } |
134 | | - } |
135 | | - } else if ((marker & 0xFF00) !== 0xFF00) { |
136 | | - break |
137 | | - } else { |
138 | | - offset += view.getUint16(offset, false) |
139 | | - } |
140 | | - } |
141 | | - return callback(-1) |
| 134 … | + cb(e.target.result) |
142 | 135 … | } |
143 | | - reader.readAsArrayBuffer(file) |
| 136 … | + reader.readAsDataURL(file) |
144 | 137 … | } |
145 | 138 … | |
| 139 … | +function removeExif (fileData, orientation) { |
| 140 … | + var clean = piexif.remove(fileData) |
| 141 … | + if (orientation != undefined) { |
| 142 … | + var exifData = { "0th": {} } |
| 143 … | + exifData["0th"][piexif.ImageIFD.Orientation] = orientation |
| 144 … | + var exifStr = piexif.dump(exifData) |
| 145 … | + return piexif.insert(exifStr, clean) |
| 146 … | + } |
| 147 … | + else |
| 148 … | + return clean |
| 149 … | +} |
| 150 … | + |
| 151 … | +function getOrientation (fileData) { |
| 152 … | + var exif = piexif.load(fileData); |
| 153 … | + return exif["0th"][piexif.ImageIFD.Orientation] |
| 154 … | +} |
| 155 … | + |
146 | 156 … | function rotate (img, orientation) { |
147 | 157 … | var canvas = document.createElement('canvas') |
148 | 158 … | var ctx = canvas.getContext('2d') |
149 | 159 … | |