Theo kinh nghiệm của tôi, ví dụ này là giải pháp tốt nhất để tải lên hình ảnh đã thay đổi kích thước: https://zocada.com/compress-resize-images-javascript-browser/
Nó sử dụng tính năng HTML5 Canvas.
Mã này là "đơn giản" như thế này:
compress(e) {
const fileName = e.target.files[0].name;
const reader = new FileReader();
reader.readAsDataURL(e.target.files[0]);
reader.onload = event => {
const img = new Image();
img.src = event.target.result;
img.onload = () => {
const elem = document.createElement('canvas');
const width = Math.min(800, img.width);
const scaleFactor = width / img.width;
elem.width = width;
elem.height = img.height * scaleFactor;
const ctx = elem.getContext('2d');
// img.width and img.height will contain the original dimensions
ctx.drawImage(img, 0, 0, width, img.height * scaleFactor);
ctx.canvas.toBlob((blob) => {
const file = new File([blob], fileName, {
type: 'image/jpeg',
lastModified: Date.now()
});
}, 'image/jpeg', 1);
},
reader.onerror = error => console.log(error);
};
}
Chỉ có một nhược điểm với tùy chọn này và nó liên quan đến xoay hình ảnh, do bỏ qua dữ liệu EXIF. Hiện tại tôi đang làm việc. Sẽ cập nhật sau khi tôi hoàn thành việc đó.
Một nhược điểm khác, là thiếu kẻ thù hỗ trợ IE / Edge, mà tôi cũng đang làm việc. Mặc dù có thông tin trong liên kết trên. Đối với cả hai vấn đề.