Uncategorized

Musafir

.tinify-wrapper { max-width: 720px; margin: 2rem auto; font-family: ‘Helvetica Neue’, Helvetica, Arial, sans-serif; } .drop-zone { background: #f0f0f0; border: 3px dashed #7acb97; border-radius: 8px; padding: 3rem 2rem; text-align: center; transition: all 0.3s ease; position: relative; } .drop-zone.active { background: #e1f3e8; border-color: #4CAF50; } .mascot { width: 120px; margin: 0 auto 1.5rem; } .file-input { display: none; } .upload-btn { background: #4CAF50; color: white; border: none; padding: 12px 24px; border-radius: 4px; cursor: pointer; font-size: 16px; transition: background 0.3s ease; } .upload-btn:hover { background: #45a049; } .results { display: none; margin-top: 2rem; background: white; padding: 2rem; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); } .size-info { display: flex; justify-content: space-between; margin: 1rem 0; padding: 1rem; background: #f8f8f8; border-radius: 4px; } .format-options { margin: 1.5rem 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 1rem; } .download-btn { background: #7acb97; color: #333; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; } .download-btn:hover { background: #4CAF50; color: white; } .loading { display: none; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255,255,255,0.9); align-items: center; justify-content: center; }

Drag & Drop Your Images Here

or

Choose Files
Original:
Compressed:
Download All Formats
const state = { originalFile: null, compressedBlobs: {}, formats: [‘webp’, ‘jpg’, ‘png’, ‘avif’] }; // Drag & Drop Handlers const dropZone = document.getElementById(‘dropZone’); [‘dragenter’, ‘dragover’].forEach(event => { dropZone.addEventListener(event, (e) => { e.preventDefault(); dropZone.classList.add(‘active’); }); }); [‘dragleave’, ‘drop’].forEach(event => { dropZone.addEventListener(event, (e) => { e.preventDefault(); dropZone.classList.remove(‘active’); }); }); dropZone.addEventListener(‘drop’, (e) => { const files = e.dataTransfer.files; if (files[0]) handleImage(files[0]); }); // File Input Handler document.getElementById(‘fileInput’).addEventListener(‘change’, (e) => { if (e.target.files[0]) handleImage(e.target.files[0]); }); async function handleImage(file) { showLoading(true); state.originalFile = file; try { const img = await loadImage(file); const canvas = await compressImage(img); await generateFormats(canvas); showResults(file.size); createFormatOptions(); } catch (error) { alert(‘Error processing image: ‘ + error.message); } showLoading(false); } function loadImage(file) { return new Promise((resolve, reject) => { const img = new Image(); img.onload = () => resolve(img); img.onerror = reject; img.src = URL.createObjectURL(file); }); } function compressImage(img) { return new Promise(resolve => { const canvas = document.createElement(‘canvas’); const ctx = canvas.getContext(‘2d’); canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0); resolve(canvas); }); } async function generateFormats(canvas) { state.compressedBlobs = {}; for (const format of state.formats) { try { const blob = await new Promise(resolve => canvas.toBlob(resolve, `image/${format}`, 0.8) ); state.compressedBlobs[format] = blob; } catch (error) { if (format === ‘avif’ && !await checkAVIFSupport()) { state.formats = state.formats.filter(f => f !== ‘avif’); } } } } function showResults(originalSize) { const results = document.getElementById(‘results’); results.style.display = ‘block’; document.getElementById(‘originalSize’).textContent = formatFileSize(originalSize); updateCompressedSize(); } function createFormatOptions() { const container = document.getElementById(‘formatOptions’); container.innerHTML = state.formats.map(format => ` ${format.toUpperCase()} `).join(”); } function downloadAllFormats() { const checkboxes = document.querySelectorAll(‘#formatOptions input:checked’); checkboxes.forEach(checkbox => { const format = checkbox.value; const blob = state.compressedBlobs[format]; if (blob) downloadBlob(blob, `compressed.${format}`); }); } function downloadBlob(blob, filename) { const link = document.createElement(‘a’); link.download = filename; link.href = URL.createObjectURL(blob); link.click(); URL.revokeObjectURL(link.href); } async function checkAVIFSupport() { try { return await new Promise(resolve => { const img = new Image(); img.onload = () => resolve(true); img.onerror = () => resolve(false); img.src = ‘data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAABAA0ABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///3WfA//y//XWkA4Bu6ODBQAB’; }); } catch { return false; } } function formatFileSize(bytes) { if (bytes === 0) return ‘0 Bytes’; const k = 1024; const sizes = [‘Bytes’, ‘KB’, ‘MB’]; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2) + ‘ ‘ + sizes[i]; } function updateCompressedSize() { const sizes = Object.values(state.compressedBlobs).map(blob => blob.size); const minSize = Math.min(…sizes); document.getElementById(‘compressedSize’).textContent = formatFileSize(minSize); } function showLoading(show) { document.getElementById(‘loading’).style.display = show ? ‘flex’ : ‘none’; }

Leave a comment