"use client"; import { useEffect, useState } from "react"; import { FFmpeg } from "@ffmpeg/ffmpeg"; import { toBlobURL } from "@ffmpeg/util"; import * as React from "react"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; function InputFile({ onFileSelect }: any) { const handleFileChange = (event: React.ChangeEvent) => { if (event.target.files && event.target.files[0]) { onFileSelect(event.target.files[0]); } }; return (
); } export default function Home() { const [ffmpeg, setFFmpeg] = useState(null); const [isLoading, setIsLoading] = useState(true); const [compressing, setCompressing] = useState(false); const [error, setError] = useState(null); const [downloadUrl, setDownloadUrl] = useState(""); const [downloadFileName, setDownloadFileName] = useState(""); const [originalFileName, setOriginalFileName] = useState(""); const [originalFileSize, setOriginalFileSize] = useState(""); const [originalFileSizeBytes, setOriginalFileSizeBytes] = useState(0); const [compressedFileSize, setCompressedFileSize] = useState(""); const [compressedFileSizeBytes, setCompressedFileSizeBytes] = useState(0); useEffect(() => { const loadFFmpeg = async () => { try { const ffmpegInstance = new FFmpeg(); const baseURL = "https://unpkg.com/@ffmpeg/core@0.12.4/dist/umd"; await ffmpegInstance.load({ coreURL: await toBlobURL( `${baseURL}/ffmpeg-core.js`, "text/javascript", ), wasmURL: await toBlobURL( `${baseURL}/ffmpeg-core.wasm`, "application/wasm", ), }); setFFmpeg(ffmpegInstance); setIsLoading(false); } catch (error) { console.error("Error loading FFmpeg:", error); setError("Failed to load FFmpeg"); } }; loadFFmpeg(); return () => { if (downloadUrl) { URL.revokeObjectURL(downloadUrl); } }; }, [downloadUrl]); const humanFileSize = (size: number) => { const i = size === 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024)); return ( (size / Math.pow(1024, i)).toFixed(2) + " " + ["B", "kB", "MB", "GB", "TB"][i] ); }; const compressImage = async (file: File) => { if (!ffmpeg || !file) return; try { setCompressing(true); setError(null); const inputFileName = "input_" + file.name; const outputFileName = `${file.name.split(".")[0]}-compressed.${file.name.split(".").pop()}`; const fileData = await file.arrayBuffer(); await ffmpeg.writeFile(inputFileName, new Uint8Array(fileData)); await ffmpeg.exec(["-i", inputFileName, "-q:v", "20", outputFileName]); const data = await ffmpeg.readFile(outputFileName); const url = URL.createObjectURL(new Blob([data], { type: file.type })); await ffmpeg.deleteFile(inputFileName); await ffmpeg.deleteFile(outputFileName); if (downloadUrl) { URL.revokeObjectURL(downloadUrl); } setDownloadUrl(url); setDownloadFileName(outputFileName); setCompressedFileSize(humanFileSize(data.length)); setCompressedFileSizeBytes(data.length); setCompressing(false); } catch (error) { console.error("Error during compression:", error); setError( `Error during compression: ${error instanceof Error ? error.message : "Unknown error"}`, ); setCompressing(false); } }; const handleCompress = async (event: React.FormEvent) => { event.preventDefault(); const form = event.currentTarget; const fileInput = form.querySelector('input[type="file"]'); if (!fileInput?.files?.length) { setError("Please select a file"); return; } const file = fileInput.files[0]; await compressImage(file); }; const handleFileSelect = (file: File) => { setOriginalFileName(file.name); setOriginalFileSize(humanFileSize(file.size)); setOriginalFileSizeBytes(file.size); }; const handleReset = () => { window.location.reload(); }; return (
Compress Size | Image Utilities

Compress Size

{originalFileName && (

Original File: {originalFileName}

Size: {originalFileSize}

)}
{isLoading ? (

loading ffmpeg...

) : ( )} {originalFileName && ( )}
{compressing && (

Compressing...

)} {error && (

{error}

)} {downloadUrl && (

Compressed File: {downloadFileName}

Size: {compressedFileSize}

Compression Ratio:{" "} {( ((originalFileSizeBytes - compressedFileSizeBytes) / originalFileSizeBytes) * 100 ).toFixed(2)} % reduction

{compressedFileSizeBytes > originalFileSizeBytes && (

Note: Compressed file is larger than the original file

)}
)} {downloadUrl && ( Download Compressed Image )}
); }