В настоящее время размер оригинальных изображений высокой четкости в Интернете составляет несколько М или даже больше, а фотографии, сделанные мобильными телефонами с более высоким разрешением, также очень велики, поэтому иногда необходимо сжимать изображения, когда пользователи их загружают.
Принцип сжатия изображения: перерисовать изображение на холст, а затем преобразовать холст в форму изображения.
function compressedImg(path, callback) {
var img = new Image();
img.src = path;
img.onload = function () {
var that = this;
// Пропорциональное сжатие по умолчанию
var w = that.width,
h = that.height;
// Чем меньше значение качества, тем размытее нарисованное изображение.
var quality = 0.7; // Качество изображения по умолчанию — 0,7,
//Создаем холст
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
// Создать узел атрибута
var anw = document.createAttribute("width");
anw.nodeValue = w;
var anh = document.createAttribute("height");
anh.nodeValue = h;
canvas.setAttributeNode(anw);
canvas.setAttributeNode(anh);
ctx.drawImage(that, 0, 0, w, h);
var base64 = canvas.toDataURL('image/jpeg', quality);
// Функция обратного вызова возвращает значение base64.
callback(base64);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSСжатие изображения</title>
</head>
<body>
<input type="file" accept="image/jpg,image/jpeg,image/png" name="file" onchange="selectImg(this)">
<br>
<img id="showImg" src="" alt="" width="">
<script src="jquery-2.1.1.js"></script>
<script>
function selectImg(file) {
if (!file.files || !file.files[0]) {
return;
}
//Определяем объект для чтения файлов
var reader = new FileReader();
console.log("Исходный размер изображения:" + file.files[0].size / 1024 + "KB");
reader.onload = function (evt) {
//Получаем base64-код изображения
var replaceSrc = evt.target.result;
compressedImg(replaceSrc,function (base) {
document.getElementById("showImg").src = base;
console.log("После сжатия:" + base.length / 1024 + "KB");
});
// Затем присвойте полученное значение тегу img
$('#showImg').attr("src", replaceSrc);
};
reader.readAsDataURL(file.files[0]);
}
//Код сжатия изображения
function compressedImg(path, callback) {
var img = new Image();
img.src = path;
img.onload = function () {
var that = this;
// Пропорциональное сжатие по умолчанию
var w = that.width,
h = that.height;
var quality = 0.7; // Качество изображения по умолчанию — 0,7.
//Создаем холст
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
// Создать узел атрибута
var anw = document.createAttribute("width");
anw.nodeValue = w;
var anh = document.createAttribute("height");
anh.nodeValue = h;
canvas.setAttributeNode(anw);
canvas.setAttributeNode(anh);
ctx.drawImage(that, 0, 0, w, h);
// Чем меньше значение качества, тем размытее нарисованное изображение.
var base64 = canvas.toDataURL('image/jpeg', quality);
// Функция обратного вызова возвращает значение base64.
callback(base64);
}
}
</script>
</body>
</html>
Поскольку изображение, преобразованное с помощью Canvas, имеет форму кода Base64, перед загрузкой нам необходимо преобразовать его в форму объекта Blob.
//dataURL преобразуется в объект Blob
function dataURLtoBlob(dataURI) {
var byteString = atob(dataURI.split(',')[1]);
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ab], {type: mimeString});
}
//загрузить
var fd = new FormData();
function upform() {
var img = $("#showImg").attr("src");
if (img) {
var blob = dataURLtoBlob(img);
fd.append('file', blob);
}
$.ajax({
type: "post",
url: «Притворяться, что у меня есть интерфейс»,
data: fd,
dataType: "json",
async: false,
processData: false,
xhrFields: {
withCredentials: true
},
success: function (data) {
},
error: function (err) {
console.log(fd);
}
});
}