Refactor resizeImage method (#7236)
- Use URL.createObjectURL (replace from FileReader) - Use HTMLCanvasElement.prototype.toBlob (replace from HTMLCanvasElement.prototype.toDataURL) - Use Promise (replace callback interface)master
parent
660cb058e1
commit
0758b00bfd
@ -0,0 +1,10 @@ |
||||
import * as base64 from '../base64'; |
||||
|
||||
describe('base64', () => { |
||||
describe('decode', () => { |
||||
it('returns a uint8 array', () => { |
||||
const arr = base64.decode('dGVzdA=='); |
||||
expect(arr).toEqual(new Uint8Array([116, 101, 115, 116])); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,10 @@ |
||||
export const decode = base64 => { |
||||
const rawData = window.atob(base64); |
||||
const outputArray = new Uint8Array(rawData.length); |
||||
|
||||
for (let i = 0; i < rawData.length; ++i) { |
||||
outputArray[i] = rawData.charCodeAt(i); |
||||
} |
||||
|
||||
return outputArray; |
||||
}; |
@ -0,0 +1,66 @@ |
||||
const MAX_IMAGE_DIMENSION = 1280; |
||||
|
||||
const getImageUrl = inputFile => new Promise((resolve, reject) => { |
||||
if (window.URL && URL.createObjectURL) { |
||||
try { |
||||
resolve(URL.createObjectURL(inputFile)); |
||||
} catch (error) { |
||||
reject(error); |
||||
} |
||||
return; |
||||
} |
||||
|
||||
const reader = new FileReader(); |
||||
reader.onerror = (...args) => reject(...args); |
||||
reader.onload = ({ target }) => resolve(target.result); |
||||
|
||||
reader.readAsDataURL(inputFile); |
||||
}); |
||||
|
||||
const loadImage = inputFile => new Promise((resolve, reject) => { |
||||
getImageUrl(inputFile).then(url => { |
||||
const img = new Image(); |
||||
|
||||
img.onerror = (...args) => reject(...args); |
||||
img.onload = () => resolve(img); |
||||
|
||||
img.src = url; |
||||
}).catch(reject); |
||||
}); |
||||
|
||||
export default inputFile => new Promise((resolve, reject) => { |
||||
if (!inputFile.type.match(/image.*/) || inputFile.type === 'image/gif') { |
||||
resolve(inputFile); |
||||
return; |
||||
} |
||||
|
||||
loadImage(inputFile).then(img => { |
||||
const canvas = document.createElement('canvas'); |
||||
const { width, height } = img; |
||||
|
||||
let newWidth, newHeight; |
||||
|
||||
if (width < MAX_IMAGE_DIMENSION && height < MAX_IMAGE_DIMENSION) { |
||||
resolve(inputFile); |
||||
return; |
||||
} |
||||
|
||||
if (width > height) { |
||||
newHeight = height * MAX_IMAGE_DIMENSION / width; |
||||
newWidth = MAX_IMAGE_DIMENSION; |
||||
} else if (height > width) { |
||||
newWidth = width * MAX_IMAGE_DIMENSION / height; |
||||
newHeight = MAX_IMAGE_DIMENSION; |
||||
} else { |
||||
newWidth = MAX_IMAGE_DIMENSION; |
||||
newHeight = MAX_IMAGE_DIMENSION; |
||||
} |
||||
|
||||
canvas.width = newWidth; |
||||
canvas.height = newHeight; |
||||
|
||||
canvas.getContext('2d').drawImage(img, 0, 0, newWidth, newHeight); |
||||
|
||||
canvas.toBlob(resolve, inputFile.type); |
||||
}).catch(reject); |
||||
}); |
Loading…
Reference in new issue