使用画布(您的第 1 步)是最灵活的方式。
使用画布在另一个画布上绘图并不比直接使用图像慢。它们都使用相同的元素基础(您正在像处理图像一样对位图进行位图传输)。
(更新:在较新的浏览器中,使用模式作为样式进行绘制确实需要对模式进行局部转换矩阵的额外步骤。)
以图案大小创建一个新画布,然后将图像简单地绘制到其中:
patternCtx.drawImage(img, 0, 0, patternWidth, patternHeight);
然后使用 patternCtx 的画布作为模式的基础(在第一次绘制时,模式在内部缓存此图像,如果可能的话,它只是将其拥有的内容加倍,直到整个画布被填满)。
另一种选择是将图像预缩放为您需要的所有尺寸,将它们全部加载,然后选择您需要的尺寸的图像。
三是自己绘制图像作为图案。然而,与内置方法相比,这不是那么有效,尽管使用上述方法(内部)您可以获得可用的结果。
手动模式示例:
var ctx = canvas.getContext('2d');
var img = new Image();
img.onload = function() {
fillPattern(this, 64, 64);
change.onchange = change.oninput = function() {
fillPattern(img, this.value, this.value);
}
};
img.src = "//i.stack.imgur.com/tkBVh.png";
// Fills canvas with image as pattern at size w,h
function fillPattern(img, w, h) {
//draw once
ctx.drawImage(img, 0, 0, w, h);
while (w < canvas.width) {
ctx.drawImage(canvas, w, 0);
w <<= 1; // shift left 1 = *2 but slightly faster
}
while (h < canvas.height) {
ctx.drawImage(canvas, 0, h);
h <<= 1;
}
}
<input id=change type=range min=8 max=120 value=64><br>
<canvas id=canvas width=500 height=400></canvas>
(或以视频为模式)。