fix: lỗi hiển thị ở frontend
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
* Compresses an image file on the client side using the Canvas API.
|
||||
* Resizes the image so that its maximum dimension is at most 2048px,
|
||||
* and encodes it as image/jpeg with a quality of 0.85.
|
||||
*
|
||||
* @param file The original image File object.
|
||||
* @returns A promise that resolves to the compressed File object.
|
||||
*/
|
||||
export function compressImage(file: File): Promise<File> {
|
||||
return new Promise((resolve) => {
|
||||
// If it's not an image, skip compression and return the original file
|
||||
if (!file.type.startsWith('image/')) {
|
||||
return resolve(file);
|
||||
}
|
||||
|
||||
const reader = new FileReader();
|
||||
reader.readAsDataURL(file);
|
||||
reader.onload = (event) => {
|
||||
const img = new Image();
|
||||
img.src = event.target?.result as string;
|
||||
img.onload = () => {
|
||||
const canvas = document.createElement('canvas');
|
||||
let width = img.width;
|
||||
let height = img.height;
|
||||
const maxDim = 2048;
|
||||
|
||||
if (width > maxDim || height > maxDim) {
|
||||
if (width > height) {
|
||||
height = Math.round((height * maxDim) / width);
|
||||
width = maxDim;
|
||||
} else {
|
||||
width = Math.round((width * maxDim) / height);
|
||||
height = maxDim;
|
||||
}
|
||||
}
|
||||
|
||||
canvas.width = width;
|
||||
canvas.height = height;
|
||||
const ctx = canvas.getContext('2d');
|
||||
if (!ctx) {
|
||||
return resolve(file);
|
||||
}
|
||||
|
||||
ctx.drawImage(img, 0, 0, width, height);
|
||||
canvas.toBlob(
|
||||
(blob) => {
|
||||
if (blob) {
|
||||
// Create a new File object with a .jpg extension
|
||||
const newName = file.name.replace(/\.[^/.]+$/, "") + ".jpg";
|
||||
const compressedFile = new File([blob], newName, {
|
||||
type: 'image/jpeg',
|
||||
lastModified: Date.now()
|
||||
});
|
||||
resolve(compressedFile);
|
||||
} else {
|
||||
resolve(file);
|
||||
}
|
||||
},
|
||||
'image/jpeg',
|
||||
0.85
|
||||
);
|
||||
};
|
||||
img.onerror = () => {
|
||||
resolve(file);
|
||||
};
|
||||
};
|
||||
reader.onerror = () => {
|
||||
resolve(file);
|
||||
};
|
||||
});
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user