Canvas实现图片上标注、缩放、移动、保存历史状态、橡皮擦功能
时间: 2023-08-07 10:04:25 浏览: 208
要实现 Canvas 上的图片标注、缩放、移动、保存历史状态、橡皮擦等功能,可以通过以下步骤来完成:
1. 加载图片。使用 JavaScript 中的 Image 对象加载图片,并在图片加载完成后将其绘制到 Canvas 上。
```javascript
const img = new Image(); // 创建 Image 对象
img.onload = function() {
ctx.drawImage(img, 0, 0); // 将图片绘制到画布上
};
img.src = 'image.jpg'; // 设置图片路径
```
2. 实现标注功能。通过鼠标事件监听用户的操作,使用 Canvas 的 API 绘制标注。例如,监听鼠标点击事件,在点击位置绘制一个圆形。
```javascript
canvas.addEventListener('mousedown', function(e) {
ctx.beginPath();
ctx.arc(e.offsetX, e.offsetY, 5, 0, 2 * Math.PI);
ctx.fill();
});
```
3. 实现缩放和移动功能。通过鼠标滚轮事件监听用户的操作,使用 Canvas 的 API 实现缩放和移动。例如,监听鼠标滚轮事件,在滚轮滚动时根据滚动方向调整画布的缩放比例。
```javascript
canvas.addEventListener('wheel', function(e) {
const delta = e.deltaY > 0 ? 0.1 : -0.1;
const scale = Math.max(0.1, Math.min(10, currentScale + delta));
ctx.scale(scale, scale);
currentScale = scale;
});
```
4. 实现保存历史状态功能。使用 JavaScript 中的数组来保存历史状态,每当用户进行操作时,将当前状态保存到数组中。撤销操作时,从数组中取出上一个状态并恢复到画布上。
```javascript
const states = []; // 保存历史状态的数组
function saveState() {
states.push(canvas.toDataURL()); // 保存当前状态
}
function undo() {
if (states.length > 0) {
const img = new Image();
img.onload = function() {
ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布
ctx.drawImage(img, 0, 0); // 绘制上一个状态
};
img.src = states.pop(); // 取出上一个状态
}
}
```
5. 实现橡皮擦功能。通过监听鼠标事件,在鼠标位置绘制一个与背景相同的矩形,来模拟橡皮擦的效果。
```javascript
canvas.addEventListener('mousemove', function(e) {
if (erasing) {
ctx.fillStyle = '#ffffff'; // 设置橡皮擦颜色为白色
ctx.fillRect(e.offsetX - 5, e.offsetY - 5, 10, 10); // 绘制矩形
}
});
```
完整示例代码如下:
```html
<!DOCTYPE html>
<html>
<body>
<canvas id="canvas" width="600" height="400"></canvas>
<button onclick="undo()">撤销</button>
<button onclick="erasing = !erasing">橡皮擦</button>
<script>
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
let currentScale = 1;
let erasing = false;
const states = [];
const img = new Image();
img.onload = function() {
ctx.drawImage(img, 0, 0);
saveState();
};
img.src = 'image.jpg';
canvas.addEventListener('mousedown', function(e) {
ctx.beginPath();
ctx.arc(e.offsetX, e.offsetY, 5, 0, 2 * Math.PI);
ctx.fill();
saveState();
});
canvas.addEventListener('mousemove', function(e) {
if (erasing) {
ctx.fillStyle = '#ffffff';
ctx.fillRect(e.offsetX - 5, e.offsetY - 5, 10, 10);
}
});
canvas.addEventListener('wheel', function(e) {
const delta = e.deltaY > 0 ? 0.1 : -0.1;
const scale = Math.max(0.1, Math.min(10, currentScale + delta));
ctx.scale(scale, scale);
currentScale = scale;
});
function saveState() {
states.push(canvas.toDataURL());
}
function undo() {
if (states.length > 1) {
const img = new Image();
img.onload = function() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0);
};
img.src = states[states.length - 2];
states.pop();
}
}
</script>
</body>
</html>
```
阅读全文