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);
}
0 Comments