Final go

function compressImage(){ if(!selectedImageFile){ alert('Please select an image first.'); return; } var target = parseFloat(document.getElementById('imageTarget').value) || 100; /* Target থেকে 5 KB কম */ var safeTargetKB = Math.max(5, target - 5); var safeTargetBytes = safeTargetKB * 1024; var originalBytes = selectedImageFile.size; var originalKB = originalBytes / 1024; var result = document.getElementById('imageResult'); /* * IMPORTANT: * Original যদি Target-এর 5 KB কমের মধ্যেই থাকে, * তাহলে আর Compress করা হবে না। * * যেমন: * Original = 48.4 KB * Target = 80 KB * Safe Target = 75 KB * * 48.4 KB < 75 KB * তাই Original-টাই Download হবে। */ if(originalBytes <= safeTargetBytes){ var originalURL = URL.createObjectURL(selectedImageFile); result.innerHTML = '✅ Image Ready!
' + 'Original: ' + originalKB.toFixed(1) + ' KB
' + 'Target: ' + target + ' KB
' + 'New Size: ' + originalKB.toFixed(1) + ' KB

' + '' + '⬇ Download Image' + ''; return; } var quality = parseFloat( document.getElementById('imageQuality').value ); var img = new Image(); var reader = new FileReader(); reader.onload = function(e){ img.onload = function(){ /* * বিভিন্ন Scale + Quality পরীক্ষা * Target-এর নিচে সবচেয়ে বড় File রাখা হবে। */ var scales = [ 1, 0.98, 0.96, 0.94, 0.92, 0.90, 0.88, 0.85, 0.82, 0.80, 0.75, 0.70, 0.65 ]; var qualities = []; for( var q = quality; q >= 0.20; q -= 0.025 ){ qualities.push(q); } var bestBlob = null; var bestSize = 0; var index = 0; function tryNext(){ if(index >= scales.length * qualities.length){ finish(); return; } var scaleIndex = Math.floor(index / qualities.length); var qualityIndex = index % qualities.length; var scale = scales[scaleIndex]; var q = qualities[qualityIndex]; index++; var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); canvas.width = Math.max( 100, Math.round(img.width * scale) ); canvas.height = Math.max( 100, Math.round(img.height * scale) ); ctx.drawImage( img, 0, 0, canvas.width, canvas.height ); canvas.toBlob( function(blob){ if(blob){ /* * শুধু Safe Target-এর নিচের * File গ্রহণ করা হবে। */ if( blob.size <= safeTargetBytes && blob.size > bestSize ){ bestBlob = blob; bestSize = blob.size; } /* * Target-এর খুব কাছাকাছি চলে এলে * আর দরকার নেই। */ if( bestSize >= safeTargetBytes * 0.97 ){ finish(); return; } } tryNext(); }, 'image/jpeg', q ); } function finish(){ /* * কোনো File পাওয়া না গেলে */ if(!bestBlob){ result.innerHTML = '❌ Target Size-এর মধ্যে Image তৈরি করা যায়নি।
' + 'Target Size একটু বাড়িয়ে আবার চেষ্টা করুন।'; return; } var finalKB = bestBlob.size / 1024; var url = URL.createObjectURL(bestBlob); var saved = 100 - (finalKB / originalKB * 100); result.innerHTML = '✅ Image Ready!
' + 'Original: ' + originalKB.toFixed(1) + ' KB
' + 'Target: ' + target + ' KB
' + 'Maximum: ' + safeTargetKB.toFixed(1) + ' KB
' + 'New Size: ' + finalKB.toFixed(1) + ' KB
' + 'Saved: ' + Math.max(0,saved).toFixed(1) + '%

' + '' + '⬇ Download Image' + ''; } tryNext(); }; img.src = e.target.result; }; reader.readAsDataURL(selectedImageFile); }

Post a Comment

0 Comments