HTML5 画布 - 当 alpha < 1 时,相同的 RGBA 样式会产生不同的颜色

Posted

技术标签:

【中文标题】HTML5 画布 - 当 alpha < 1 时,相同的 RGBA 样式会产生不同的颜色【英文标题】:HTML5 canvas - same RGBA style produces different colours when alpha < 1 【发布时间】:2016-10-27 17:49:57 【问题描述】:

在下面的示例中,相同的 strokeStyle 会产生不同的颜色,根据线条的长度 (?) 而有所不同。

只有在 alpha

这种奇怪行为的原因是什么?有没有更好的方法来设置笔画的透明度,这样无论长度如何我都能得到相同的结果?

谢谢。

var c = document.getElementById('c1');
var ctx = c.getContext('2d');

ctx.fillStyle = '#FFFFFF';
ctx.fillRect(0, 0, 400, 400);

ctx.lineWidth = 10;
ctx.strokeStyle = 'rgba(0, 0, 255, 0.3)';

ctx.moveTo(10, 10);
ctx.lineTo(20, 10);
ctx.stroke();

ctx.moveTo(10, 30);
ctx.lineTo(40, 30);
ctx.stroke();

ctx.moveTo(10, 50);
ctx.lineTo(80, 50);
ctx.stroke();

ctx.moveTo(10, 70);
ctx.lineTo(160, 70);
ctx.stroke();

ctx.moveTo(10, 90);
ctx.lineTo(320, 90);
ctx.stroke();
#c1 
  border: 1px solid black;
<canvas   id="c1">
</canvas>

【问题讨论】:

因为你只创建了一条路径,但是绘制了多次。要创建新路径,您需要在定义和绘制它之前调用ctx.beginPath()。在这里,您的 parh 的最终状态也涵盖了所有第一个状态,因此透明度会降低。 【参考方案1】:

var c = document.getElementById('c1');
var ctx = c.getContext('2d');

ctx.fillStyle = '#FFFFFF';
ctx.fillRect(0, 0, 400, 400);

ctx.lineWidth = 10;
ctx.strokeStyle = 'rgba(0, 0, 255, 0.3)';


ctx.moveTo(10, 10);
ctx.lineTo(20, 10);


ctx.moveTo(10, 30);
ctx.lineTo(40, 30);

ctx.moveTo(10, 50);
ctx.lineTo(80, 50);


ctx.moveTo(10, 70);
ctx.lineTo(160, 70);


ctx.moveTo(10, 90);
ctx.lineTo(320, 90);
ctx.stroke();
#c1 
  border: 1px solid black;
<canvas   id="c1">
</canvas>

我不知道这种行为的原因,但解决方案是只在最后敲击。

希望这会有所帮助!

【讨论】:

谢谢!您的回答使我对问题有了深入的了解。我需要在开始每一行之前添加ctx.beginPath()moveTo 之前)。如果我不这样做,显然stroke() 不会丢弃旧路径,因此会再次绘制旧线,因此由于“累积”不透明度,它们的颜色会变暗。 这很聪明。我将来肯定需要知道这一点!谢谢

以上是关于HTML5 画布 - 当 alpha < 1 时,相同的 RGBA 样式会产生不同的颜色的主要内容,如果未能解决你的问题,请参考以下文章

HTML5怎样创建画布?

HTML5之canvas 7画布旋转

如何在 HTML5 画布上绘图

画布上的水平滚动。 HTML5

在 HTML5 画布中剪切多个图像

关于HTML5画布canvas的功能