gpt4 book ai didi

javascript - 在 HTML5 canvas 中,如何用我选择的背景遮盖图像?

转载 作者:太空狗 更新时间:2023-10-29 13:07:50 27 4
gpt4 key购买 nike

我试图通过 canvas 的 globalCompositeOperation 来实现这一点,但没有成功,所以我想在这里提问。这里有类似的问题,但我没有在其中找到我的案例。

我的 Canvas 区域中有图层(从下到上的绘制顺序):

  • Canvas 底部填充纯白色(#fff,带fillRect)
  • 第一张图片 house 是一张房子的图片。背景是透明的。 (见下文)
  • 第二张图片 roofOverlay 是一张覆盖“ mask ”图片,屋顶区域为红色(可以是任何颜色,但为了清晰起见,请看下面的红色)

两张图片都占据了整个 Canvas ,并且完美地重叠在一起,因此红色屋顶区域与房子相匹配。

然后我有一个重复的背景 repeatPattern 模式,我想在红色区域内使用 ONLY:用 repeatPattern 填充红色区域. (可以是任何东西,但假设是六边形或其他任何东西)

在伪代码中,理想的情况是:

roofOverlay.maskBackground(repeatPattern)

(在旁注中,我也希望能够弄乱背景图案的 HSL 值,但我认为一旦我什至可以显示图案,这就非常简单了)

预期结果:

预期的结果是一座屋顶带有 repeatPattern 图像纹理的房子。

注意:我知道带有 mask 的剪切路径,但我不能在这里使用它们。这个例子被简化了,为多个不同的房子绘制所有的路径将是太多的工作。我只有屋顶的叠加 png 文件。

引用图片

House 房子


House roof overlay roofOverlay

最佳答案

以下是如何使用“roofOverlay”将“屋顶图案”合成到“房子”的顶部

enter image description here

这是一个多部分的过程:

  1. 在 Canvas #1 上画房子。
  2. 在 canvas#2 上绘制红色 roofOverlay。
  3. 设置 canvas#2 的 context.globalCompositeOperation = 'source-in'
  4. 在 Canvas #2 上绘制您想要的图案
  5. 合成将使您想要的图案替换红色覆盖层——仅在红色覆盖层区域。

这是一个可以在屋顶上装载草的 fiddle :http://jsfiddle.net/m1erickson/SWP6v/

这里是在屋顶上使用格子图案填充的代码:

注意:我假设您希望房屋和屋顶位于不同的 Canvas 上,这样您就可以浏览各种屋顶选择。如果您需要在 1 个 Canvas 上绘制所有内容,您可以将屋顶 Canvas 绘制到房屋 Canvas 上。

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<style>
body{ background-color: ivory; }
canvas{border:1px solid red;}
#container{position:relative;}
#house{position:absolute; top:0; left:0;}
#canvas{position:absolute; top:0; left:0;}
</style>

<script>
$(function(){

var house=document.getElementById("house");
var ctxHouse=house.getContext("2d");
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");

var red=new Image();
red.onload=function(){
canvas.width=red.width;
canvas.height=red.height;

var houseImage=new Image();
houseImage.onload=function(){
house.width=houseImage.width;
house.height=houseImage.height;
ctxHouse.drawImage(houseImage,0,0);
}
houseImage.src="https://dl.dropbox.com/u/1122582/stackoverflow/house.png";

ctx.drawImage(red,0,0);

var imageObj = new Image();
imageObj.onload = function() {
var pattern = ctx.createPattern(imageObj, 'repeat');
ctx.globalCompositeOperation = 'source-in';
ctx.rect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = pattern;
ctx.fill();
};
imageObj.src = "http://dl.dropbox.com/u/139992952/stackoverflow/lattice.jpg";
}
red.src="https://dl.dropbox.com/u/1122582/stackoverflow/roof-overlay.png";

}); // end $(function(){});
</script>

</head>

<body>
<div id="container">
<canvas id="house" width=300 height=300></canvas>
<canvas id="canvas" width=300 height=300></canvas>
</div>
</body>
</html>

关于javascript - 在 HTML5 canvas 中,如何用我选择的背景遮盖图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15526943/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com