Реализуйте механизм обрезки
Требования:
- Знание API Canvas в JavaScript для рисования и манипуляций с изображениями.
Функциональность:
- Добавьте область обрезки на отображенном изображении и сделайте эту область перетаскиваемой. Это дает пользователям возможность выбирать желаемую область для обрезки.
Добавьте соответствующие методы в main.js
.
-
Создайте метод cutImage
Метод cutImage
в основном отвечает за две задачи: одна - создать маску, а вторая - использовать CSS - свойство background
для предоставления实时-предпросмотра выбранной области обрезки.
cutImage: function () {
var t = this;
t.editBox.height = t.imgHeight;
t.editBox.width = t.imgWidth;
t.editBox.style.display = "block";
t.editBox.style.left = t.px;
t.editBox.style.top = t.py;
var cover = t.editBox.getContext("2d");
cover.fillStyle = "rgba(0, 0, 0, 0.5)";
cover.fillRect(0, 0, t.imgWidth, t.imgHeight);
cover.clearRect(t.sx, t.sy, t.sHeight, t.sWidth);
document.getElementById("show_edit").style.background =
"url(" + t.imgUrl + ")" + -t.sx + "px " + -t.sy + "px no-repeat";
document.getElementById("show_edit").style.height = t.sHeight + "px";
document.getElementById("show_edit").style.width = t.sWidth + "px";
},
- Создайте метод
drag
drag: function () {
var t = this;
var draging = false;
var startX = 0;
var startY = 0;
document.getElementById("cover_box").onmousemove = function (e) {
var pageX = e.pageX - (t.regional.offsetLeft + this.offsetLeft);
var pageY = e.pageY - (t.regional.offsetTop + this.offsetTop);
if (
pageX > t.sx &&
pageX < t.sx + t.sWidth &&
pageY > t.sy &&
pageY < t.sy + t.sHeight
) {
this.style.cursor = "move";
this.onmousedown = function () {
draging = true;
t.ex = t.sx;
t.ey = t.sy;
startX = e.pageX - (t.regional.offsetLeft + this.offsetLeft);
startY = e.pageY - (t.regional.offsetTop + this.offsetTop);
};
window.onmouseup = function () {
draging = false;
};
if (draging) {
if (t.ex + (pageX - startX) < 0) {
t.sx = 0;
} else if (t.ex + (pageX - startX) + t.sWidth > t.imgWidth) {
t.sx = t.imgWidth - t.sWidth;
} else {
t.sx = t.ex + (pageX - startX);
}
if (t.ey + (pageY - startY) < 0) {
t.sy = 0;
} else if (t.ey + (pageY - startY) + t.sHeight > t.imgHeight) {
t.sy = t.imgHeight - t.sHeight;
} else {
t.sy = t.ey + (pageY - startY);
}
t.cutImage();
}
} else {
this.style.cursor = "auto";
}
};
},
Для понимания этого метода вам нужно понять следующие ключевые моменты:
var pageX = e.pageX - (t.regional.offsetLeft + this.offsetLeft);
var pageY = e.pageY - (t.regional.offsetTop + this.offsetTop);
С помощью двух строк кода выше мы получаем расстояние между мышью и фоновым изображением. e.pageX
представляет расстояние от мыши до левого края браузера, а t.regional.offsetLeft + this.offsetLeft
вычисляет расстояние от изображения до левого края браузера. Аналогично можно вывести расстояние сверху.
if ( pageX > t.sx && pageX < t.sx + t.sWidth && pageY > t.sy && pageY < t.sy + t.sHeight )
После того, как вы поняли расстояние между мышью и фоновым изображением, это должно быть легко понять: оно определяет, находится ли мышь внутри области изображения.
t.ex = t.sx;
t.ey = t.sy;
startX = e.pageX - (t.regional.offsetLeft + this.offsetLeft);
startY = e.pageY - (t.regional.offsetTop + this.offsetTop);
Эти два фрагмента кода заслуживают особого внимания. Первые две строки записывают координаты из последнего скриншота (или если предыдущего не было, то начальные координаты); следующие две строки записывают координаты, когда кнопка мыши нажата. Вы можете проверить эти значения отдельно с помощью console.log()
.
if (draging) {
if (t.ex + (pageX - startX) < 0) {
t.sx = 0;
} else if (t.ex + (pageX - startX) + t.sWidth > t.imgWidth) {
t.sx = t.imgWidth - t.sWidth;
} else {
t.sx = t.ex + (pageX - startX);
}
if (t.ey + (pageY - startY) < 0) {
t.sy = 0;
} else if (t.ey + (pageY - startY) + t.sHeight > t.imgHeight) {
t.sy = t.imgHeight - t.sHeight;
} else {
t.sy = t.ey + (pageY - startY);
}
t.cutImage();
}
Вышеописанный код по существу говорит: если мы в процессе перетаскивания, то нужно обновлять значения t.sx
и t.sy
в реальном времени в зависимости от изменения координат и вызывать метод cutImage
для предоставления实时-предпросмотра.
Координаты области обрезки при движении = последняя записанная позиция + (текущая позиция мыши - позиция, когда кнопка мыши была нажата)