基于canvas在浏览器图像上画线 然后让线条自动吸附到灰黑图片的灰色区域附近
时间: 2023-05-26 22:05:41 浏览: 169
一种可行的方法是使用canvas的getImageData方法获取图片的像素数据,然后遍历每个像素点的RGB值,判断是否属于灰色区域。如果是灰色区域,则记录该点的坐标,然后在画线时吸附到该点附近。
具体实现代码如下:
HTML部分:
```html
<canvas id="canvas" width="800" height="600"></canvas>
```
JavaScript部分:
```javascript
// 获取canvas和上下文
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
// 加载图片
var img = new Image();
img.onload = function() {
// 设置画布背景为白色
ctx.fillStyle = "#FFFFFF";
ctx.fillRect(0, 0, 800, 600);
// 将图片画到画布上
ctx.drawImage(img, 0, 0);
// 获取图片像素数据
var imageData = ctx.getImageData(0, 0, 800, 600);
var pixels = imageData.data;
// 找到灰色区域的像素点
var grayPixels = [];
for (var i = 0; i < pixels.length; i += 4) {
var r = pixels[i];
var g = pixels[i+1];
var b = pixels[i+2];
var gray = (r + g + b) / 3;
if (gray >= 100 && gray <= 200) {
grayPixels.push(i);
}
}
// 绘制线条
var lineStart = null;
canvas.onmousedown = function(e) {
lineStart = { x: e.clientX, y: e.clientY };
};
canvas.onmousemove = function(e) {
if (lineStart) {
// 获取离鼠标最近的灰色像素点
var nearestPixel = null;
var minDistance = Number.MAX_VALUE;
for (var i = 0; i < grayPixels.length; i++) {
var x = (grayPixels[i] / 4) % 800;
var y = Math.floor((grayPixels[i] / 4) / 800);
var distance = Math.sqrt((x-e.clientX)*(x-e.clientX) + (y-e.clientY)*(y-e.clientY));
if (distance < minDistance) {
nearestPixel = { x: x, y: y };
minDistance = distance;
}
}
// 绘制线条
ctx.strokeStyle = "#000000";
ctx.lineWidth = 2;
ctx.beginPath();
ctx.moveTo(lineStart.x, lineStart.y);
ctx.lineTo(nearestPixel.x, nearestPixel.y);
ctx.stroke();
lineStart = nearestPixel;
}
};
canvas.onmouseup = function() {
lineStart = null;
};
};
img.src = "image.png";
```
这段代码会在canvas上显示名为“image.png”的图片,并在灰色区域绘制线条,线条的起点和终点都会在灰色区域附近。您可以将该代码保存为HTML文件,然后将一张名为“image.png”的图片与该文件放在同一文件夹中,用浏览器打开该HTML文件,就可以看到效果了。
阅读全文