简体   繁体   English

在画布上用不透明度(点线)进行绘制

[英]Drawing on canvas with opacity (dots in line) javascript

I have that drawing logic: 我有那个绘图逻辑:

Draw = function(canvas, ctx, mousePosition) {

    var grad = ctx.createLinearGradient(0, 0, canvas[0].width, 0);
    grad.addColorStop(0, currentLineColor);
    grad.addColorStop(1, currentLineColor);

    ctx.lineWidth = currentLineWidth;
    ctx.strokeStyle = grad;
    ctx.lineCap = 'round';
    ctx.lineJoin = 'round';
    ctx.globalAlpha = 0.4;

    ctx.beginPath();
    ctx.moveTo(lastMousePosition.x, lastMousePosition.y);
    ctx.lineTo(mousePosition.x, mousePosition.y);
    ctx.stroke();
};

When i set the globalAlpha to set opacity in this code a see dots in my drawn line. 当我在此代码中设置globalAlpha设置不透明度时,在绘制的线条中看到了点。 This logic is attached to mosemove event. 此逻辑附加到mosemove事件。

Yes, that is to be expected as each line is overdrawn at the connection points, and their alpha data will add up. 是的,这是可以预期的,因为每条线在连接点上都被覆盖,它们的Alpha数据将累加。

I would suggest the following approach and attach a proof-of-concept demo at the end, feel free to adopt that code to your project: 我建议采用以下方法,并在最后附加一个概念验证演示,请随时在您的项目中采用该代码:

  1. Create two canvases, one main and one draft on top 创建两个画布,一个主画布和一个草稿在顶部
  2. Set the alpha directly on the top element using CSS (opacity) and always keep globalAlpha=1 使用CSS(不透明度)直接在顶部元素上设置Alpha,并始终保持globalAlpha=1
  3. For each stroke (pen down, pen up) draw on draft canvas (use lines between each point) 对于每个笔划(向下笔,向上笔)在草稿画布上绘制(在每个点之间使用线)
  4. On pen up, set globalAlpha on main canvas equal the CSS opacity of top canvas 在笔上,在主画布上设置globalAlpha等于顶部画布的CSS不透明度
  5. Draw top canvas to main canvas using drawImage() . 使用drawImage()顶部画布绘制到主画布。
  6. Clear top canvas, eat, sleep, repeat (from 3). 清除顶层帆布,吃饭,睡觉,重复(从3开始)。

Proof-of-concept 验证的概念

 var draft = document.getElementById("draft"); var main = document.getElementById("main"); var ctx = draft.getContext("2d"); var mctx = main.getContext("2d"); var isDown = false, prev, alpha = 0.4; // setup pen ctx.strokeStyle = "rgb(0,200,127)"; ctx.lineWidth = 16; ctx.lineCap = "round"; // important to make lines cont. // set up alpha draft.style.opacity = alpha; // CSS alpha for draft mctx.globalAlpha = alpha; // context alpha for main draft.onmousedown = function(e){ isDown = true; prev = getXY(e); // set prev. point as start }; window.onmousemove = function(e){ if (!isDown) return; var point = getXY(e); ctx.beginPath(); // new path ctx.moveTo(prev.x, prev.y); // start at prev. point ctx.lineTo(point.x, point.y); // line to new point ctx.stroke(); // stroke prev = point; // update prev. point }; window.onmouseup = function(){ isDown = false; // when up: mctx.drawImage(draft, 0, 0); // copy drawing to main ctx.clearRect(0, 0, draft.width, draft.height); // clear draft }; function getXY(e) { var r = draft.getBoundingClientRect(); return {x: e.clientX - r.left, y: e.clientY - r.top} } 
 #draft {cursor:crosshair} .sandwich {position:relative} .sandwich>canvas {position:absolute;left:0;top:0} 
 <div class="sandwich"> <canvas id="main" width=600 height=600></canvas> <canvas id="draft" width=600 height=600></canvas> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM