import React, { useState, useEffect } from "react"; import { fromBlob, blobToURL } from "image-resize-compress"; import { Button } from "../ui/button"; import { ImageIcon, DownloadIcon, SlidersHorizontal, FileImage, } from "lucide-react"; export default function ImageResize() { const [previewUrl, setPreviewUrl] = useState(null); const [resizedBlob, setResizedBlob] = useState(null); const [imgQuality, setImgQuality] = useState(80); const [selectedFile, setSelectedFile] = useState(null); const [originalSize, setOriginalSize] = useState(0); const [resizedSize, setResizedSize] = useState(0); const [originalExtension, setOriginalExtension] = useState("webp"); useEffect(() => { const resizeImage = async () => { if (!selectedFile) return; try { const width = "auto"; const height = "auto"; const ext = selectedFile.name.split(".").pop().toLowerCase(); setOriginalExtension(ext); setOriginalSize((selectedFile.size / 1024).toFixed(2)); // KB // Only apply quality change for JPEG or WebP const format = ["jpg", "jpeg", "webp"].includes(ext) ? ext : "jpeg"; // fallback to jpeg for better quality control const resized = await fromBlob(selectedFile, imgQuality, width, height, format); const url = await blobToURL(resized); setResizedBlob(resized); setResizedSize((resized.size / 1024).toFixed(2)); // KB setPreviewUrl(url); } catch (err) { console.error("Image resizing failed:", err); } }; resizeImage(); }, [selectedFile, imgQuality]); const handleFileChange = (event) => { const file = event.target.files[0]; if (file) { setSelectedFile(file); } }; const handleDownload = () => { if (!resizedBlob) return; const link = document.createElement("a"); link.href = URL.createObjectURL(resizedBlob); link.download = `resized-image.${originalExtension}`; link.click(); }; return (

Image Resizer

setImgQuality(e.target.value)} className="w-full accent-[#6d9e37]" />
{previewUrl && (

Original Size: {originalSize} KB

Resized Size: {resizedSize} KB

Preview:

Resized Preview
)}
); }