Почему это нужно?
Шаг 1: Загрузка информации об изображении
const imageURL = 'path/to/our/image.jpeg';
<img>
const inputImage = new Image();
inputImage.src = imageURL;
Затем перенесем картинку на холст (canvas), что позволит нам манипулировать параметрами изображения:
inputImage.onload = () => {
const outputImage = document.createElement('canvas');
outputImage.width = inputImage.naturalWidth;
outputImage.height = inputImage.naturalHeight;
const ctx = outputImage.getContext('2d');
ctx.drawImage(inputImage, 0, 0);
document.body.appendChild(inputImage);
document.body.appendChild(outputImage);
};
inputImage.src = imageURL;
Шаг 2: Приведение пропорций изображения к квадрату
const outputImageAspectRatio = 1;
inputImage.onload = () => {
const inputWidth = inputImage.naturalWidth;
const inputHeight = inputImage.naturalHeight;
const inputImageAspectRatio = inputWidth / inputHeight;
let outputWidth = inputWidth;
let outputHeight = inputHeight;
if (inputImageAspectRatio > outputImageAspectRatio) {
outputWidth = inputHeight * outputImageAspectRatio;
} else if (inputImageAspectRatio < outputImageAspectRatio) {
outputHeight = inputHeight / outputImageAspectRatio;
}
const outputX = (outputWidth - inputWidth) * .5;
const outputY = (outputHeight - inputHeight) * .5;
const outputImage = document.createElement('canvas');
outputImage.width = outputWidth;
outputImage.height = outputHeight;
const ctx = outputImage.getContext('2d');
ctx.drawImage(inputImage, outputX, outputY);
document.body.appendChild(inputImage);
document.body.appendChild(outputImage);
};
inputImage.src = imageURL;
Шаг 3: Функция преобразования пропорций изображения с изменяемыми параметрами
/**
* @param {string} url - The source image
* @param {number} aspectRatio - The aspect ratio
* @return {Promise<HTMLCanvasElement>} A Promise that resolves with the resulting image as a canvas element
*/
function crop(url, aspectRatio) {
return new Promise(resolve => {
const inputImage = new Image();
inputImage.onload = () => {
const inputWidth = inputImage.naturalWidth;
const inputHeight = inputImage.naturalHeight;
const inputImageAspectRatio = inputWidth / inputHeight;
let outputWidth = inputWidth;
let outputHeight = inputHeight;
if (inputImageAspectRatio > aspectRatio) {
outputWidth = inputHeight * aspectRatio;
} else if (inputImageAspectRatio < aspectRatio) {
outputHeight = inputHeight / aspectRatio;
}
const outputX = (outputWidth - inputWidth) * .5;
const outputY = (outputHeight - inputHeight) * .5;
const outputImage = document.createElement('canvas');
outputImage.width = outputWidth;
outputImage.height = outputHeight;
const ctx = outputImage.getContext('2d');
ctx.drawImage(inputImage, outputX, outputY);
resolve(outputImage);
};
inputImage.src = url;
});
}
Использование функции
crop('path/to/our/image.jpeg', 1).then(canvas => {
document.body.appendChild(canvas);
});
crop('path/to/our/image.jpeg', 16/9).then(canvas => {
document.body.appendChild(canvas);
});
Заключение
Браузеры мобильных устройств могут считывать параметры изображения из EXIF заголовков, что может вызвать проблемы. Использование слишком больших изображений может привести к переполнению памяти для элемента canvas. Изменение размеров маленьких картинок может значительно ухудшить их качество.