【发布时间】:2014-09-06 15:27:54
【问题描述】:
猜测帖子的标题可能需要编辑,但现在我不知道问题出在哪里。我已经在这里和其他地方阅读了类似问题的页面和答案。一个 Stack Overflow 的答案特别接近,但我不明白。
我想要一个函数,在画布上以所需坐标绘制多边形,并用从文件加载的一些背景图像填充它们(足够大,不需要平铺)。三角形适合测试。显然我应该使用drawImage和clip,并给多边形一个边框,我可以为clip和笔画重新使用相同的路径。显然我应该保持顺序
- define path
- save
- clip
- drawImage
- restore
- stroke.
还在某处读到一次加载图像就足够了。 (如果你想让我引用所有这些假设的来源,我会寻找我在哪里看到的。大部分在 Stack Overflow 上)
HTML 是空的
<body onload = "main ();"></body>
第一种方法,假装浏览器会等待图片加载:
var ctx, img;
var image_path = 'bg.jpg';
function main () {
var CANVAS_SIZE = 600;
var view_field_cnv = document.createElement ('canvas');
view_field_cnv.width = CANVAS_SIZE;
view_field_cnv.height = CANVAS_SIZE;
view_field_cnv.style.border = "1px solid";
document.body.appendChild (view_field_cnv);
ctx = view_field_cnv.getContext ('2d');
img = document.createElement ('img');
img.src = image_path;
place_triangle (0, 0);
place_triangle (300, 300);
place_triangle (500, 500);
place_triangle (0, 0);
}
function place_triangle (x, y) {
console.log (x, y);
ctx.beginPath ();
ctx.moveTo (x + 10, y);
ctx.lineTo (x + 110, y);
ctx.lineTo (x + 60, y + 40);
ctx.closePath ();
img = document.createElement ('img');
img.src = image_path;
ctx.save ();
ctx.clip ();
ctx.drawImage (img, x, y);
ctx.restore ();
ctx.stroke ();
}
这会绘制所有三个三角形,但没有裁剪图像。
第二次尝试,在 image.onload 中使用 drawImage:
var ctx;
var image_path = 'bg.jpg';
function main () {
var CANVAS_SIZE = 600;
var view_field_cnv = document.createElement ('canvas');
view_field_cnv.width = CANVAS_SIZE;
view_field_cnv.height = CANVAS_SIZE;
view_field_cnv.style.border = "1px solid";
document.body.appendChild (view_field_cnv);
ctx = view_field_cnv.getContext ('2d');
place_triangle (0, 0);
place_triangle (300, 300);
place_triangle (500, 500);
place_triangle (0, 0);
}
function place_triangle (x, y) {
console.log (x, y);
var img;
ctx.beginPath ();
ctx.moveTo (x + 10, y);
ctx.lineTo (x + 110, y);
ctx.lineTo (x + 60, y + 40);
ctx.closePath ();
img = document.createElement ('img');
img.src = image_path;
img.onload = function () {
ctx.save ();
ctx.clip ();
ctx.drawImage (img, x, y);
ctx.restore ();
ctx.stroke ();
}
}
这个确实绘制了剪裁的图像,但只有一个三角形,最后一个。只是注释掉保存和恢复并没有帮助。
所以,我不明白加载图像、保存、恢复以及可能还有一百万种其他事情。错误在哪里?
【问题讨论】:
标签: javascript canvas onload drawimage clip