【问题标题】:html5-canvas pattern size fluctuationshtml5-canvas图案大小波动
【发布时间】:2016-11-21 02:34:54
【问题描述】:

我对 createPattern() 有疑问。首先,我定义了一个画布并将其作为模式的源传递,以应用于第二个(更大的)画布 - 就像在 epistemex 的这个演示中一样:

http://jsfiddle.net/epistemex/dn7bvjh0/ 

这很好用。但是,当我多次调用下面的函数时,每次更改“接收”画布(“canvasContext”)的大小时,画布的大小都会波动。画布越大,图案的元素彼此放置得越近。当画布(不同尺寸)彼此相邻放置时,这会导致节奏中断,我正在寻找解决方案!

var unit = heightNow/2;

var canvasPattern = document.createElement("canvas");
canvasPattern.width = unit;
canvasPattern.height = unit;
var pctx = canvasPattern.getContext("2d");

pctx.beginPath();
pctx.fillStyle = basicClrs1[woordNummer];
pctx.rect(0,0,unit,unit);
pctx.fill();
pctx.beginPath();
pctx.fillStyle = basicClrs2[woordNummer];
pctx.rect(0,0,unit/2,unit/2);
pctx.fill();
pctx.lineWidth = unit/4;
pctx.stroke;

var pattern = canvasContext.createPattern(canvasPattern,"repeat");
canvasContext.fillStyle = pattern;
canvasContext.rect(0,0,widthNow,heightNow);
canvasContext.translate(0,0,widthNow,heightNow);
canvasContext.fill();

http://automatto.nl/img/pattern.png

【问题讨论】:

  • 你能提供一个完整的例子吗?不清楚 heightNow 和 widthNow 是什么,我不确定你提供的所有代码是否都包含在函数中。我已经创建了this fiddle,但我不确定它是否与您正在做的相匹配。
  • 如果画布的宽度和高度在任何时候都不同,那么这可能会导致“节奏中断”,因为图案大小仅取决于高度。
  • 在每个页面加载时都会生成新的 div,具有不同的宽度和高度('widthNow' 和 'heightNow')。但两者总是变量“单位”的精确倍数 - 模式模块的大小 - 所以我希望模式与高度和宽度同步。事实并非如此,div 越大,在右侧和底部可见的“下一个”模式模块的意外片段就越多。
  • 您链接到的图像显示垂直方向您正在获得模式的下一个副本;这是因为画布的高度是奇数,偶数不会发生这种情况。由于高度奇数,pattern-module包含半个像素,因此不可避免地无法正常显示。关于宽度,你确定它是单位的倍数吗?在图像中它看起来不像,并且代码不强制它是单位的倍数(尽管它是高度的)。
  • 感谢您的回复。是的,宽度和高度一样,肯定是单位的倍数。我看起来不像那样,因为图案神秘地缩小了一点。同样的情况在这里发生:jsfiddle.net/czjdwk4h 如果您更改单位值,则模式有时适合,有时不适合。

标签: javascript canvas html5-canvas


【解决方案1】:

问题出现在图案高度(和宽度) - unit - 不是整数的情况下。用于图案的画布的高度和宽度向下舍入。当图案重复预期的次数时,最终会剩下几个像素,这些像素会被图案的其他部分填充。

这种不需要的效果可以使用缩放来解决。

只需将最后一行(填充调用)替换为以下内容:

var repetitionsX = Math.floor(widthNow / canvasPattern.width);
var repetitionsY = Math.floor(heightNow / canvasPattern.height);
var scalingFactorX = widthNow / (canvasPattern.width * repetitionsX);
var scalingFactorY = heightNow / (canvasPattern.height * repetitionsY);
canvasContext.save();
canvasContext.scale(scalingFactorX, scalingFactorY);  
canvasContext.fill();
canvasContext.restore();

【讨论】:

  • 感谢乔恩,这正在解决问题!在这种情况下,我什至可以通过注意“单位”(其中宽度和高度是倍数)始终是整数来解决它(在阅读了上面的评论之后)。但如果这是不可能的,那么缩放是很好​​的解决方法。人们应该只知道像圆圈这样的图案元素在缩放后可能是椭圆形。再次感谢,非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-04-14
  • 2012-12-05
  • 2012-02-27
  • 2013-01-04
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多