Drawing semi-transparent lines on mouse movement in HTML5 canvas(在 HTML5 画布中绘制鼠标移动的半透明线)
问题描述
我试图让用户通过在画布上绘制半透明线条的绘画"工具在区域上绘画来指定区域.其目的是为将在画布下方绘制的图像指定一个蒙版".
I'm trying to let users specify an area by painting over it with a "paint" tool that draws semi-transparent lines on a canvas. Its purpose is specifying a "mask" for an image that will be drawn below on the canvas.
这是我迄今为止尝试过的:
This is what I tried so far:
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var canvasPos = canvas.getBoundingClientRect();
var dragging = false;
drawImage();
$(canvas).mousedown(mouseDown);
$(canvas).mouseup(mouseUp);
$(canvas).mousemove(mouseMove);
function drawImage() {
var img = new Image();
img.src = "aHR0cDovL2ltZzIudGltZWluYy5uZXQvaGVhbHRoL2ltZy93ZWIvMjAxMy8wMy9zbGlkZXMvY2F0LWFsbGVyZ2llcy00MDB4NDAwLmpwZw==";
img.onload = function () {
ctx.drawImage(img, 0, 0);
};
}
function mouseDown(e) {
var pos = getCursorPosition(e);
dragging = true;
ctx.strokeStyle = 'rgba(0, 100, 0, 0.25)';
ctx.lineCap = 'round';
ctx.lineJoin = 'round';
ctx.lineWidth = 15;
ctx.beginPath();
ctx.moveTo(pos.x, pos.y);
}
function mouseUp(e) {
dragging = false;
}
function mouseMove(e) {
var pos, i;
if (!dragging) {
return;
}
pos = getCursorPosition(e);
ctx.lineTo(pos.x, pos.y);
ctx.stroke();
}
function getCursorPosition(e) {
return {
x: e.clientX - canvasPos.left,
y: e.clientY - canvasPos.top
};
}
- 上述代码的 jsfiddle 链接:http://jsfiddle.net/s34PL/2/一个>
此示例代码的问题是,随后绘制的像素使不透明度变得越来越不可见.我认为这是因为这条线是 15 像素宽(但我希望它那么宽).
The issue with this example code is that subsequent pixels that are drawn are making the opacity becomes less and less visible. I think it's because the line is 15 pixels wide (but I want it that wide though).
我该如何解决这个问题?
How can I solve this issue?
谢谢!
推荐答案
问题是你一遍又一遍地画整个路径:
The problem is that you are drawing the whole path again and again:
function mouseMove(e) {
...
ctx.stroke(); // Draws whole path which begins where mouseDown happened.
}
您只需绘制路径的新段 (http://jsfiddle.net/jF9a6/).然后......你遇到了 15px 宽度的问题.
You have to draw only the new segment of the path (http://jsfiddle.net/jF9a6/). And then ... you have the problem with the 15px width of the line.
那么如何解决呢?我们必须像你一样立即画线,但要避免在现有线的顶部画线.这是代码:http://jsfiddle.net/yfDdC/
So how to solve this? We have to draw the line at once as you did, but avoid painting on top of existing lines. Here is the code: http://jsfiddle.net/yfDdC/
最大的变化是 paths
数组.它包含是的,路径 :-) 路径是存储在 mouseDown
和 mouseMove
函数中的点数组.在 mouseDown 函数中创建新路径:
The biggest change is the paths
array. It contains yeah, paths :-) A path is an array of points stored in mouseDown
and mouseMove
functions. New path is created in mouseDown function:
paths.push([pos]); // Add new path, the first point is current pos.
在 mouseMove 中,将当前鼠标位置添加到 paths
数组中的最后一个路径并刷新图像.
In the mouseMove you add current mouse position to the last path in paths
array and refreshs the image.
paths[paths.length-1].push(pos); // Append point tu current path.
refresh();
refresh()
函数清除整个画布,再次绘制猫并绘制每条路径.
The refresh()
function clears the whole canvas, draws the cat again and draws every path.
function refresh() {
// Clear canvas and draw the cat.
ctx.clearRect(0, 0, ctx.width, ctx.height);
if (globImg)
ctx.drawImage(globImg, 0, 0);
for (var i=0; i<paths.length; ++i) {
var path = paths[i];
if (path.length<1)
continue; // Need at least two points to draw a line.
ctx.beginPath();
ctx.moveTo(path[0].x, path[0].y);
...
for (var j=1; j<path.length; ++j)
ctx.lineTo(path[j].x, path[j].y);
ctx.stroke();
}
}
这篇关于在 HTML5 画布中绘制鼠标移动的半透明线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在 HTML5 画布中绘制鼠标移动的半透明线


- Flexslider 箭头未正确显示 2022-01-01
- Fetch API 如何获取响应体? 2022-01-01
- 使用RSelum从网站(报纸档案)中抓取多个网页 2022-09-06
- Quasar 2+Apollo:错误:找不到ID为默认的Apollo客户端。如果您在组件设置之外,请使用ProvideApolloClient() 2022-01-01
- addEventListener 在 IE 11 中不起作用 2022-01-01
- 失败的 Canvas 360 jquery 插件 2022-01-01
- 如何使用 JSON 格式的 jQuery AJAX 从 .cfm 页面输出查 2022-01-01
- CSS媒体查询(最大高度)不起作用,但为什么? 2022-01-01
- Css:将嵌套元素定位在父元素边界之外一点 2022-09-07
- 400或500级别的HTTP响应 2022-01-01