ngx-image-compression
Version:
A lightweight Angular image compression and conversion library
67 lines (66 loc) • 1.93 kB
JavaScript
// src/index.ts
async function compressImage(file, options = {}) {
const {
maxWidth = 1024,
maxHeight = 1024,
quality = 0.7,
format = "webp",
returnType = "file",
fileName = "compressed"
} = options;
const dataUrl = await readFileAsDataURL(file);
const img = await loadImage(dataUrl);
const { width, height } = resizeDimensions(img.width, img.height, maxWidth, maxHeight);
const canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, width, height);
const mimeType = `image/${format}`;
return new Promise((resolve, reject) => {
canvas.toBlob(
(blob) => {
if (!blob) return reject(new Error("Compression failed"));
if (returnType === "blob") {
resolve(blob);
} else if (returnType === "base64") {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.readAsDataURL(blob);
} else {
const compressedFile = new File([blob], `${fileName}.${format}`, { type: mimeType });
resolve(compressedFile);
}
},
mimeType,
quality
);
});
}
function resizeDimensions(width, height, maxW, maxH) {
let ratio = Math.min(maxW / width, maxH / height);
ratio = ratio < 1 ? ratio : 1;
return {
width: Math.round(width * ratio),
height: Math.round(height * ratio)
};
}
function readFileAsDataURL(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = (e) => resolve(e.target?.result);
reader.onerror = reject;
reader.readAsDataURL(file);
});
}
function loadImage(dataUrl) {
return new Promise((resolve, reject) => {
const img = new Image();
img.onload = () => resolve(img);
img.onerror = reject;
img.src = dataUrl;
});
}
export {
compressImage
};