Код, который вы взяли из net (который должен иметь ссылку / атрибуцию), очень старая школа (не менее 5 лет). Кроме того, код очень низкого качества.
Обратите внимание, что 2d контекст translate
, scale
, rotate
и transform
являются кумулятивными. Если вы наберете ctx.rotate(Math.PI/2)
(90 градусов), а затем снова наберете ctx.rotate(Math.PI/2)
, вы фактически повернули Math.PI
(180 градусов). Однако код каждый раз создает новый холст, поэтому это не будет причиной двойного поворота. Почему это происходит, не ясно в коде.
Вращение на холсте по часовой стрелке. 0 градусов в 3 часа.
Загрузите и поверните 90 градусов
Разделяйте задачи и используйте современные JS. Загрузка изображения и отображение изображения должны быть отдельными функциями
Сначала функция поворота изображения и подгонка холста
// Rotates image 90 and sets canvas size to fit rotated image
function drawImageRot90(ctx, image) {
ctx.canvas.style.width = (ctx.canvas.width = image.height) + "px";
ctx.canvas.style.height = (ctx.canvas.height = image.width) + "px";
ctx.setTransform(0, 1, -1, 0, ctx.canvas.width, 0); // overwrite existing transform
ctx.drawImage(image, 0, 0);
ctx.setTransform(1, 0, 0, 1, 0, 0); // reset default transform
}
Затем функция загрузки изображения. Функция возвращает обещание, которое передаст изображение при загрузке.
// Return promise to provide loaded image as described in details AKA `p`
function loadImage(details) {
return new Promise(loaded => {
if (!details.oImage) {
const img = new Image;
img.src = details.src
img.addEventListener("load",() => {
img.width = details.width;
img.height = details.height;
loaded(img);
}, {once: true}
);
} else {
loaded(details.oImage);
}
});
}
Соединение его
loadImage(this.get(0))
.then((img) => {
const canvas = document.createElement("canvas");
drawImageRot90(canvas.getContext("2d"), img);
})
Функция поворота с шагом 90
function drawImageRot(ang, ctx, image) { // ang must be 0, 90, 180, 270 or will default 180
if (ang === 90 || ang === 270) {
ctx.canvas.style.width = (ctx.canvas.width = image.height) + "px";
ctx.canvas.style.height = (ctx.canvas.height = image.width) + "px";
if (ang === 90) { ctx.setTransform(0, 1, -1, 0, ctx.canvas.width, 0) }
else { ctx.setTransform(0, -1, 1, 0, 0, ctx.canvas.height) }
} else {
ctx.canvas.style.width = (ctx.canvas.width = image.width) + "px";
ctx.canvas.style.height = (ctx.canvas.height = image.height) + "px";
if (ang === 0) { ctx.setTransform(1, 0, 0, 1, 0, 0) }
else { ctx.setTransform(-1, 0, 0, -1, ctx.canvas.width, ctx.canvas.height) }
}
ctx.drawImage(image, 0, 0);
ctx.setTransform(1, 0, 0, 1, 0, 0); // reset default transform
}