Sourav Mukherjee
@Design By
100% FREE LIFETIME
100% FREE LIFETIME
Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
@import url(‘https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Playfair+Display:wght@700&display=swap’); .converter-container { font-family: ‘Inter’, system-ui, sans-serif; } .title-font { font-family: ‘Playfair Display’, serif; } @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn 0.6s ease-out forwards; } .drop-active { background-color: rgba(59, 130, 246, 0.08); border-color: #3b82f6; box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.15); } .slider-thumb { appearance: none; width: 20px; height: 20px; background: #3b82f6; border-radius: 50%; cursor: pointer; box-shadow: 0 2px 6px rgba(0,0,0,0.2); } .slider-thumb::-webkit-slider-thumb { appearance: none; width: 20px; height: 20px; background: #3b82f6; border-radius: 50%; cursor: pointer; box-shadow: 0 2px 6px rgba(0,0,0,0.2); }
🖼️→WEBP

Convert Any Image to WEBP

JPG, PNG, HEIC, SVG, PSD, ARW, TIFF, BMP, GIF → high-quality WEBP • 100% browser-based • Live size comparison Learn more about convert image to webp.

⬆️

Drag & Drop or Click to Upload

Supports most image formats

// ──────────────────────────────────────────────── let selectedFile = null; let webpBlob = null; let webpObjectURL = null; const dropArea = document.getElementById(‘drop-area’); const fileInput = document.getElementById(‘file-upload’); const convertArea = document.getElementById(‘converter-area’); const origPreview = document.getElementById(‘preview-original’); const webpPreview = document.getElementById(‘preview-webp’); const origStats = document.getElementById(‘original-stats’); const webpStats = document.getElementById(‘webp-stats’); const qualitySlider = document.getElementById(‘quality-slider’); const qualityValue = document.getElementById(‘quality-value’); const losslessToggle= document.getElementById(‘lossless-toggle’); const convertBtn = document.getElementById(‘convert-btn’); const downloadBtn = document.getElementById(‘download-btn’); const resetBtn = document.getElementById(‘reset-btn’); const savingsLine = document.getElementById(‘savings-line’); // ─── Event listeners ──────────────────────────────── dropArea.addEventListener(‘click’, () => fileInput.click()); [‘dragover’,’dragenter’].forEach(ev => dropArea.addEventListener(ev, e => { e.preventDefault(); dropArea.classList.add(‘drop-active’); })); [‘dragleave’,’drop’].forEach(ev => dropArea.addEventListener(ev, e => { e.preventDefault(); dropArea.classList.remove(‘drop-active’); })); dropArea.addEventListener(‘drop’, e => { const file = e.dataTransfer.files[0]; if (file?.type.startsWith(‘image/’)) handleFile(file); }); fileInput.addEventListener(‘change’, e => { const file = e.target.files[0]; if (file) handleFile(file); }); qualitySlider.addEventListener(‘input’, () => qualityValue.textContent = qualitySlider.value); convertBtn.addEventListener(‘click’, convertToWebp); resetBtn.addEventListener(‘click’, resetAll); downloadBtn.addEventListener(‘click’, downloadWebp); // ─── Functions ────────────────────────────────────── function handleFile(file) { selectedFile = file; downloadBtn.disabled = true; if (webpObjectURL) URL.revokeObjectURL(webpObjectURL); webpBlob = null; webpObjectURL = null; const reader = new FileReader(); reader.onload = e => { origPreview.src = e.target.result; origStats.innerHTML = `
File: ${file.name}
Size: ${(file.size / 1024 / 1024).toFixed(2)} MB
Type: ${file.type.split(‘/’)[1]?.toUpperCase() || file.type}
`; convertArea.classList.remove(‘hidden’); savingsLine.classList.add(‘hidden’); webpPreview.src = ”; webpStats.innerHTML = ”; }; reader.readAsDataURL(file); } async function convertToWebp() { if (!selectedFile) return alert(“Upload an image first”); convertBtn.disabled = true; convertBtn.innerHTML = ‘Converting… ‘; try { const img = await loadImage(URL.createObjectURL(selectedFile)); const canvas = document.createElement(‘canvas’); canvas.width = img.naturalWidth; canvas.height = img.naturalHeight; canvas.getContext(‘2d’).drawImage(img, 0, 0); const quality = parseInt(qualitySlider.value) / 100; const lossless = losslessToggle.checked; canvas.toBlob(blob => { if (!blob) throw new Error(“Blob creation failed”); webpBlob = blob; if (webpObjectURL) URL.revokeObjectURL(webpObjectURL); webpObjectURL = URL.createObjectURL(blob); webpPreview.src = webpObjectURL; const origMB = (selectedFile.size / 1024 / 1024).toFixed(2); const webpMB = (blob.size / 1024 / 1024).toFixed(2); const savings = (((selectedFile.size – blob.size) / selectedFile.size) * 100).toFixed(1); webpStats.innerHTML = `
Size: ${webpMB} MB
Mode: ${lossless ? ‘Lossless’ : `Lossy (${Math.round(quality * 100)}%)`}
Resolution: ${img.naturalWidth} × ${img.naturalHeight}
`; savingsLine.innerHTML = `Original: ${origMB} MB → WEBP: ${webpMB} MB (-${savings}%)`; savingsLine.classList.remove(‘hidden’); downloadBtn.disabled = false; convertBtn.disabled = false; convertBtn.innerHTML = ‘Convert to WEBP ‘; }, ‘image/webp’, lossless ? 1.0 : quality); } catch (err) { console.error(err); alert(“Conversion failed — try a different image or lower quality.”); convertBtn.disabled = false; convertBtn.innerHTML = ‘Convert to WEBP ‘; } } function loadImage(src) { return new Promise((resolve, reject) => { const img = new Image(); img.onload = () => resolve(img); img.onerror = () => reject(new Error(“Image load failed”)); img.src = src; }); } function downloadWebp() { if (!webpBlob) { alert(“Please convert the image first”); return; } // Create fresh URL on every download click (fixes revocation issues in some browsers) const url = URL.createObjectURL(webpBlob); const a = document.createElement(‘a’); a.href = url; a.download = (selectedFile.name || ‘image’).replace(/\.[^.]+$/, ”) + ‘.webp’; document.body.appendChild(a); a.click(); // Clean up after a short delay (prevents premature revocation) setTimeout(() => { document.body.removeChild(a); URL.revokeObjectURL(url); }, 100); } function resetAll() { if (webpObjectURL) URL.revokeObjectURL(webpObjectURL); selectedFile = null; webpBlob = null; webpObjectURL = null; fileInput.value = ”; convertArea.classList.add(‘hidden’); savingsLine.classList.add(‘hidden’); origPreview.src = ”; webpPreview.src = ”; origStats.innerHTML = ”; webpStats.innerHTML = ”; downloadBtn.disabled = true; } qualityValue.textContent = qualitySlider.value;
allbesttool.com
Latest posts by allbesttool.com (see all)