- Use URL.createObjectURL (replace from FileReader) - Use HTMLCanvasElement.prototype.toBlob (replace from HTMLCanvasElement.prototype.toDataURL) - Use Promise (replace callback interface)
		
			
				
	
	
		
			66 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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);
 | |
| });
 |