- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这样的代码:
<body>
<canvas id="main" width=400 height=300></canvas>
<script>
var windowToCanvas = function(canvas, x, y) {
var bbox = canvas.getBoundingClientRect();
return {
x: (x - bbox.left) * (canvas.width / bbox.width),
y: (y - bbox.top) * (canvas.height / bbox.height)
};
};
image = new Image();
image.src = "redball.png";
image.onload = function (e) {
var canvas = document.getElementById('main'),
context = canvas.getContext('2d');
var pattern = context.createPattern(image, "repeat");
function draw(loc) {
context.clearRect(0, 0, canvas.width, canvas.height);
context.fillStyle = pattern;
context.beginPath();
context.moveTo(loc.x, loc.y);
context.lineTo(loc.x + 300, loc.y + 60);
context.lineTo(loc.x + 70, loc.y + 200);
context.closePath();
context.fill();
}
canvas.onmousemove = function(e) {
var event = e || window.event,
x = event.x || event.clientX,
y = event.y || event.clientY,
loc = windowToCanvas(canvas, x, y);
draw(loc);
};
}
</script>
</body>
我调用createPattern API,使用背景图像填充三 Angular 形,但是当鼠标移动时,背景图像也会移动,我只想要背景图像在固定位置,我该如何解决这个问题?
最佳答案
将上下文模式视为 Canvas 上的背景图像。
模式始终从 Canvas 原点 [0,0] 开始。如果图案重复,则图案会以向右和向下重复的图 block 填充 Canvas 。
因此,如果您在 Canvas 上移动三 Angular 形,三 Angular 形将始终显示图案的不同部分。
有多种方法可以让三 Angular 形始终显示图案图像的相同部分。
选项#1 -- context.translate
将 Canvas 原点从默认的 [0,0] 位置移动到三 Angular 形位置 [loc.x,loc.y]。您可以通过 Canvas 转换来做到这一点。特别是,翻译命令将移动原点。移动原点也会移动图案的左上角起始位置,以便图案始终相对于移动三 Angular 形以相同的方式对齐:
var pattern = context.createPattern(image, "repeat");
context.fillStyle=pattern;
function draw(loc) {
context.clearRect(0, 0, canvas.width, canvas.height);
// the origin [0,0] is now [loc.x,loc.y]
context.translate(loc.x,loc.y);
context.beginPath();
// you are already located at [loc.x,loc.y] so
// you don't need to add loc.x & loc.y to
// your drawing coordinates
context.moveTo(0,0);
context.lineTo(300,60);
context.lineTo(70,200);
context.closePath();
context.fill();
// always clean up! Move the origina back to [0,0]
context.translate(-loc.x,-loc.y);
}
使用翻译的演示:
var windowToCanvas = function(canvas, x, y) {
var bbox = canvas.getBoundingClientRect();
return {
x: (x - bbox.left) * (canvas.width / bbox.width),
y: (y - bbox.top) * (canvas.height / bbox.height)
};
};
image = new Image();
image.src = "https://dl.dropboxusercontent.com/u/139992952/multple/jellybeans.jpg";
image.onload = function (e) {
var canvas = document.getElementById('main'),
context = canvas.getContext('2d');
var pattern = context.createPattern(image, "repeat");
context.fillStyle=pattern;
draw({x:0,y:0});
function draw(loc) {
context.clearRect(0, 0, canvas.width, canvas.height);
// the origin [0,0] is now [loc.x,loc.y]
context.translate(loc.x,loc.y);
context.beginPath();
// you are already located at [loc.x,loc.y] so
// you don't need to add loc.x & loc.y to
// your drawing coordinates
context.moveTo(0,0);
context.lineTo(300,60);
context.lineTo(70,200);
context.closePath();
context.fill();
// always clean up! Move the origina back to [0,0]
context.translate(-loc.x,-loc.y);
}
canvas.onmousemove = function(e) {
var event = e || window.event,
x = event.x || event.clientX,
y = event.y || event.clientY,
loc = windowToCanvas(canvas, x, y);
draw(loc);
};
}
body{ background-color: ivory; }
#canvas{border:1px solid red;}
<h4>Move the mouse to move the triangle<br>The image is large, so be patient while it loads</h4>
<canvas id="main" width=600 height=600></canvas>
选项#2——合成
使用合成而不是图案化在三 Angular 形顶部绘制图像。合成是一种控制在 Canvas 上绘制的新像素如何与现有 Canvas 像素交互的方法。特别是,source-atop
合成将导致仅在新像素与现有非透明像素重叠的位置绘制任何新像素。您要做的是以纯色绘制三 Angular 形,然后使用 source-atop
合成仅在实心三 Angular 形像素所在的位置绘制图像:
function draw(loc) {
context.clearRect(0, 0, canvas.width, canvas.height);
context.beginPath();
context.moveTo(loc.x, loc.y);
context.lineTo(loc.x + 300, loc.y + 60);
context.lineTo(loc.x + 70, loc.y + 200);
context.closePath();
// fill the triangle with a solid color
context.fill();
// set compositing to 'source-atop' so
// new drawings will only be visible if
// they overlap a solid color pixel
context.globalCompositeOperation='source-atop';
context.drawImage(image,loc.x,loc.y);
// always clean up! Set compositing back to its default value
context.globalCompositeOperation='source-over';
}
使用合成的演示:
var windowToCanvas = function(canvas, x, y) {
var bbox = canvas.getBoundingClientRect();
return {
x: (x - bbox.left) * (canvas.width / bbox.width),
y: (y - bbox.top) * (canvas.height / bbox.height)
};
};
image = new Image();
image.src = "https://dl.dropboxusercontent.com/u/139992952/multple/jellybeans.jpg";
image.onload = function (e) {
var canvas = document.getElementById('main'),
context = canvas.getContext('2d');
var pattern = context.createPattern(image, "repeat");
context.fillStyle=pattern;
draw({x:0,y:0});
function draw(loc) {
context.clearRect(0, 0, canvas.width, canvas.height);
context.beginPath();
context.moveTo(loc.x, loc.y);
context.lineTo(loc.x + 300, loc.y + 60);
context.lineTo(loc.x + 70, loc.y + 200);
context.closePath();
// fill the triangle with a solid color
context.fill();
// set compositing to 'source-atop' so
// new drawings will only be visible if
// they overlap a solid color pixel
context.globalCompositeOperation='source-atop';
context.drawImage(image,loc.x,loc.y);
// always clean up! Set compositing back to its default value
context.globalCompositeOperation='source-over';
}
canvas.onmousemove = function(e) {
var event = e || window.event,
x = event.x || event.clientX,
y = event.y || event.clientY,
loc = windowToCanvas(canvas, x, y);
draw(loc);
};
}
body{ background-color: ivory; }
#canvas{border:1px solid red;}
<h4>Move the mouse to move the triangle<br>The image is large, so be patient while it loads</h4>
<canvas id="main" width=600 height=600></canvas>
更多选项...
还有更多可能的选择。我将提及其中一些,但不会给出代码示例:
创建填充三 Angular 形的 img 元素,并使用 drawImage(img,loc.x,loc.y)
在 Canvas 上移动该三 Angular 形图像
从三 Angular 形创建一个剪切区域。剪切区域导致新绘图仅显示在定义的剪切区域中。在这种情况下,新的绘制图像仅在三 Angular 形内部可见,而在三 Angular 形外部不可见。
还有更多不那么传统的选项...
关于javascript - HTML5 Canvas createPattern API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29305326/
我在变量“pattern”上收到 TypeError,并且我的脚本不会执行超过标记的断点。我正在使用 JCanvas 和 JQuery,并且所有依赖项都已就位。错误原因是什么。使用了类似的实现 her
我正在尝试绘制一个使用 fillStyle 模式的填充矩形。下面的代码允许绘制一个矩形,但之后,所有后续操作都将放弃绘制。 这是控制填充的代码: var img = new Image(); img.
我有一个简单的函数,旨在使使用 HTML 中的 canvas 标签更轻松地创建模式。我在网站上有一张嵌入此代码的图像: .invisible { di
首先是 live code 我想使用 Canvas 用图像填充正方形的样式。 我创建了 2 个矩形: 问题:如何将图像作为图案应用到旋转和平移的粉红色正方形上? 使用这个JS: $(document)
我有这样的代码: var windowToCanvas = function(canvas, x, y) { var bbox = canvas.getBoundingClien
我使用 PNG 作为 HTML5 Canvas 中充当音频可视化工具的一系列矩形的背景图案,但是,我的代码收到了未捕获的类型错误: HTML: JS: canvas = document.getEl
我正在尝试获取重复的 Canvas 图案。可悲的是,我能找到的所有例子都重复了一张图片。所以我尝试了这个: function init() { var canvas = document.getEle
我使用 Canvas 绘制简单的矩形并用地板图案 (PNG) 填充它们。但是,如果我利用“相机”脚本来处理 HTML5 Canvas 的变换偏移,则矩形形状会适当移动,但填充图案似乎总是从屏幕上的固定
我想在 Canvas(HTML5) 上显示图像,以便稍后能够拖放它。这就是我开始的方式,我使用的是在 Canvas 上绘制的圆形形状,然后我希望其背景纹理是此粘贴代码外部定义的图像。现在我知道纹理/图
我似乎找不到关于如何执行此操作的任何可靠信息,所以我想知道是否有人可以为我指明正确的方向。 我有一个很大的 sprite 表,我们称它为 textures.png。每个纹理都是 64x64 像素,我需
我使用 SVG 图像作为 HTML5 canvas 元素的背景图案,语法如下: var img = new Image(); img.onload = function() { var pat
我遇到一个问题,我传递给 createPattern 的任何图像都会放大超过 2 倍。我尝试使用: contextInQuesiton.scale(1,1) 但是图像最初仍然按照我的明确指示进行放大。
我见过一些关于如何调整图像大小的技巧在 IMG 标签中使用,但我想在里面有一个图像变量一个Javascript,调整它的大小,然后使用里面的图像context.createPattern(图像,“重复
在查找如何将重复的图像背景绘制到 上时(是的,我是 的新手),我看到有两种方法可以做到这一点: 使用drawImage()在for循环以在 中手动重复图像 使用 context.createPa
我从 (https://w.soundcloud.com/player/widget-6c3640e3.js & https://w.soundcloud.com/player/multi-sound
我是一名优秀的程序员,十分优秀!