使用canvas和JavaScript实现一个图片编辑的功能 需求:1.从网络上获取一张图片,可以在该图片上添加贴纸元素 贴纸元素可以移动,可以拖拽贴纸元素的边框放大和缩小,可以清空贴纸元素
实现思路:
-
使用HTML中的canvas元素来显示图片,通过JavaScript代码从网络上获取图片并绘制到canvas上。
-
定义一个贴纸元素类,该类包含贴纸元素的位置、大小、图像等属性,并提供移动、缩放、清空等方法。
-
将贴纸元素添加到canvas中,并为其添加事件监听器,用于响应鼠标的拖拽和缩放事件。
-
在canvas上绘制贴纸元素,并提供一些工具按钮,用于控制贴纸元素的添加、移动、缩放和清空等操作。
-
最后,将canvas中的图像转换为Base64格式的字符串,以便于保存或分享。
代码实现:
HTML代码:
<!DOCTYPE html>
<html>
<head>
<title>图片编辑器</title>
<meta charset="utf-8">
<style type="text/css">
canvas {
border: 1px solid gray;
}
.tool-button {
margin: 5px;
padding: 5px;
border: 1px solid gray;
cursor: pointer;
}
</style>
</head>
<body>
<h1>图片编辑器</h1>
<canvas id="canvas" width="640" height="480"></canvas><br>
<button id="add-sticker" class="tool-button">添加贴纸</button>
<button id="clear-stickers" class="tool-button">清空贴纸</button>
<script src="editor.js"></script>
</body>
</html>
JavaScript代码:
// 从网络上获取图片
var image = new Image();
image.src = "https://picsum.photos/640/480";
// 等待图片加载完成后再绘制到canvas中
image.onload = function() {
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
context.drawImage(image, 0, 0, canvas.width, canvas.height);
};
// 定义贴纸元素类
function Sticker(x, y, width, height, image) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.image = image;
}
Sticker.prototype = {
// 绘制贴纸元素到canvas中
draw: function(context) {
context.drawImage(this.image, this.x, this.y, this.width, this.height);
context.strokeStyle = "red";
context.strokeRect(this.x, this.y, this.width, this.height);
},
// 判断鼠标是否在贴纸元素范围内
isInside: function(x, y) {
return x >= this.x && x <= this.x + this.width && y >= this.y && y <= this.y + this.height;
},
// 移动贴纸元素
move: function(dx, dy) {
this.x += dx;
this.y += dy;
},
// 缩放贴纸元素
resize: function(dw, dh) {
this.width += dw;
this.height += dh;
},
// 清空贴纸元素
clear: function() {
this.image = null;
}
};
// 定义全局变量
var stickers = []; // 存储所有的贴纸元素
var selected = null; // 当前选中的贴纸元素
// 将贴纸元素添加到canvas中
function addSticker(x, y, width, height, image) {
var sticker = new Sticker(x, y, width, height, image);
stickers.push(sticker);
drawStickers();
}
// 绘制所有的贴纸元素到canvas中
function drawStickers() {
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
// 清空canvas
context.clearRect(0, 0, canvas.width, canvas.height);
// 绘制图片
context.drawImage(image, 0, 0, canvas.width, canvas.height);
// 绘制贴纸元素
stickers.forEach(function(sticker) {
sticker.draw(context);
});
}
// 根据鼠标位置获取当前选中的贴纸元素
function getSelectedSticker(x, y) {
var selectedSticker = null;
stickers.forEach(function(sticker) {
if (sticker.isInside(x, y)) {
selectedSticker = sticker;
}
});
return selectedSticker;
}
// 处理鼠标的拖拽事件
function onDragStart(event) {
var x = event.clientX;
var y = event.clientY;
// 获取当前选中的贴纸元素
selected = getSelectedSticker(x, y);
// 如果有贴纸元素被选中,则将鼠标事件绑定到该贴纸元素上
if (selected) {
event.target.style.cursor = "move";
canvas.addEventListener("mousemove", onDrag);
canvas.addEventListener("mouseup", onDragEnd);
}
}
function onDrag(event) {
var x = event.clientX;
var y = event.clientY;
var dx = x - event.target.offsetLeft;
var dy = y - event.target.offsetTop;
// 移动选中的贴纸元素
selected.move(dx, dy);
drawStickers();
}
function onDragEnd(event) {
event.target.style.cursor = "default";
canvas.removeEventListener("mousemove", onDrag);
canvas.removeEventListener("mouseup", onDragEnd);
}
// 处理鼠标的缩放事件
function onResizeStart(event) {
var x = event.clientX;
var y = event.clientY;
// 获取当前选中的贴纸元素
selected = getSelectedSticker(x, y);
// 如果有贴纸元素被选中,则将鼠标事件绑定到该贴纸元素上
if (selected) {
event.target.style.cursor = "se-resize";
canvas.addEventListener("mousemove", onResize);
canvas.addEventListener("mouseup", onResizeEnd);
}
}
function onResize(event) {
var x = event.clientX;
var y = event.clientY;
var dw = x - event.target.offsetLeft - selected.x - selected.width;
var dh = y - event.target.offsetTop - selected.y - selected.height;
// 缩放选中的贴纸元素
selected.resize(dw, dh);
drawStickers();
}
function onResizeEnd(event) {
event.target.style.cursor = "default";
canvas.removeEventListener("mousemove", onResize);
canvas.removeEventListener("mouseup", onResizeEnd);
}
// 处理清空贴纸元素的事件
function clearStickers() {
stickers = [];
drawStickers();
}
// 添加事件监听器
document.getElementById("add-sticker").addEventListener("click", function() {
addSticker(100, 100, 100, 100, image);
});
document.getElementById("clear-stickers").addEventListener("click", clearStickers);
canvas.addEventListener("mousedown", function(event) {
if (event.button === 0) {
onDragStart(event);
} else if (event.button === 2) {
onResizeStart(event);
}
});
// 将canvas中的图像转换为Base64格式的字符串
function getBase64Image() {
var canvas = document.getElementById("canvas");
return canvas.toDataURL("image/png");
}
参考资料:
原文地址: https://www.cveoy.top/t/topic/AeF 著作权归作者所有。请勿转载和采集!