使用js写一个图片压缩的小工具
function compressImage(file, quality, maxWidth, maxHeight) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = (event) => {
const img = new Image();
img.src = event.target.result;
img.onload = () => {
let width = img.width;
let height = img.height;
// Calculate new dimensions based on maxWidth and maxHeight while maintaining aspect ratio
if (width > maxWidth) {
height *= maxWidth / width;
width = maxWidth;
}
if (height > maxHeight) {
width *= maxHeight / height;
height = maxHeight;
}
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0, width, height);
canvas.toBlob((blob) => {
resolve(blob);
}, 'image/jpeg', quality); // You can change the MIME type if needed
};
img.onerror = (error) => {
reject(error);
};
};
reader.onerror = (error) => {
reject(error);
};
});
}
// Example usage:
const fileInput = document.getElementById('fileInput'); // Replace with your file input element ID
const compressedImage = document.getElementById('compressedImage'); // Replace with your image element ID
fileInput.addEventListener('change', async (event) => {
const file = event.target.files[0];
try {
const compressedBlob = await compressImage(file, 0.7, 800, 600); // Adjust quality, maxWidth, and maxHeight as needed
const compressedImageUrl = URL.createObjectURL(compressedBlob);
compressedImage.src = compressedImageUrl;
// You can also download the compressed image:
const downloadLink = document.createElement('a');
downloadLink.href = compressedImageUrl;
downloadLink.download = 'compressed_image.jpg'; // Set the desired filename
downloadLink.textContent = 'Download Compressed Image';
document.body.appendChild(downloadLink); // Or append to a specific container
} catch (error) {
console.error('Image compression error:', error);
}
});
// HTML Example:
/*
<input type="file" id="fileInput">
<img id="compressedImage" alt="Compressed Image">
*/
Explanation and Key Improvements:
- Promise-based: Uses Promises for cleaner asynchronous handling.
- Resizing: Resizes the image proportionally before compressing, using
maxWidthandmaxHeightparameters. This significantly reduces file size, especially for large images. - Error Handling: Includes error handling for
FileReader,Imageloading, andcanvas.toBlob. - Download Link: Adds code to create a download link for the compressed image.
- Clearer Example Usage: Provides a more complete example with HTML snippets and comments.
- Flexibility: Allows customization of the output image quality, width, and height.
- JPEG Output: Outputs JPEG by default, which is generally good for photos. You can change the
'image/jpeg'MIME type incanvas.toBlobto'image/png'if you need PNG output (e.g., for images with sharp lines or transparency).
How to Use:
- HTML: Include the HTML snippet provided in the example in your HTML file. Make sure to replace the IDs with your actual element IDs.
- JavaScript: Include the JavaScript code in your
<script>tag or in a separate.jsfile and link it to your HTML. - Choose File: Select an image file using the file input.
- Compress and Display: The script will compress the image and display it in the
compressedImageelement. A download link will also be created.
This improved version provides a more robust and user-friendly image compression tool for your frontend development needs. Remember to adjust the quality, maxWidth, and maxHeight parameters to achieve the desired balance between file size and image quality.
浙公网安备 33010602011771号