【问题标题】:Creating HTML5 canvas patterns and filling stuff with them创建 HTML5 画布模式并用它们填充内容
【发布时间】:2013-07-08 01:41:47
【问题描述】:

我在使用 .createPattern(image,"repeat") 时遇到问题。

  1. 我可以用.toDataURL().createPattern() 创建的自己的图案填充正方形吗?
  2. 我可以用当前画布的图案填充正方形吗?

var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");

context.strokeRect(0.5, 0.5, 10, 10);
context.arc(5.5, 5.5, 3, 0, Math.PI);
context.rect(3, 3, 1, 1);
context.rect(7, 3, 1, 1);
context.stroke();

var img = new Image();
img.src = canvas.toDataURL();
context.drawImage(img, 10, 10); // works

context.beginPath();
var pattern = context.createPattern(img, "repeat"); // doesn't work
context.fillStyle = pattern;
context.fillRect(20, 20, 100, 100);
context.fill();

context.beginPath();
var pattern2 = context.createPattern(canvas, "repeat"); // doesn't work
context.fillStyle = pattern2;
context.fillRect(120, 20, 100, 100);
context.fill();
<canvas id="canvas" width="320" height="240" style="border: solid darkblue 1px;background-color: aliceblue"></canvas>

【问题讨论】:

    标签: javascript jquery html canvas


    【解决方案1】:

    您需要为该模式创建一个单独的画布,因为您无法自行引用该画布以用于模式。

    原因是当你引用你试图绘制的原始画布时,图案将具有相同的大小,并且只会绘制一个实例,因为没有更多空间。

    因此,要使其工作,您需要定义一个较小尺寸的图案,因此我们需要一个单独的画布或图像并将其作为图案的源传入。

    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    
    // create the off-screen canvas
    var canvasPattern = document.createElement("canvas");
    canvasPattern.width = 10;
    canvasPattern.height = 10;
    var contextPattern = canvasPattern.getContext("2d");
    
    // draw pattern to off-screen context
    contextPattern.beginPath();
    contextPattern.strokeRect(0.5, 0.5, 10, 10);
    contextPattern.arc(5.5, 5.5, 3, 0, Math.PI);
    contextPattern.rect(3, 3, 1, 1);
    contextPattern.rect(7, 3, 1, 1);
    contextPattern.stroke();
    
    // now pattern will work with canvas element    
    var pattern = context.createPattern(canvasPattern,"repeat");
    context.fillStyle = pattern;
    context.fillRect(20, 20, 100, 100);
    context.fill();
    <canvas id="canvas" width="320" height="240" style="border: solid darkblue 1px;background-color: aliceblue"></canvas>

    【讨论】:

    • 嗯,这就是它的工作原理。奇怪的是它不接受自我重复。谢谢。
    • 哦,为什么不接受图像作为图案var img = new Image(); img.src = canvas.toDataURL();
    • @VixinG 问题是整个画布被用作模式,所以它只会绘制一个实例,因为它的大小相同(如果你删除了 beginPath,你会在原始代码中看到)。屏幕外画布或图像具有不同的尺寸,这是制作图案所必需的。希望这是有道理的:)
    • @VixinG 同理,图片参考画布,大小相同(没有图案空间)
    • 现在说得通了。感谢您的澄清:)祝您有美好的一天
    猜你喜欢
    • 2013-09-07
    • 1970-01-01
    • 2023-03-06
    • 2013-06-24
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多