【发布时间】:2015-04-17 05:15:18
【问题描述】:
我正在寻找一种解决方案来更改产品的纹理/图案。
此刻我有:
- 一张带有透明背景的沙发的 .png 图片
- 纹理的.png图片
使用以下代码:
<canvas id="a" width="800" height="500">Canvas not supported on your browser</canvas>
var width = $(window).width();
var height = $(window).height();
var c = document.getElementById("a");
var ctx = c.getContext("2d");
var can2 = document.createElement('canvas');
document.body.appendChild(can2)
can2.width = c.width;
can2.height = c.height;
var ctx2 = can2.getContext("2d");
var test = new Image();
test.src = "Images/newBank.png";
test.onload = function () {
ctx2.drawImage(test, 0, 0);
};
var img = new Image();
img.src = "Images/texturetrans.png";
img.onload = function () {
ctx2.globalCompositeOperation = 'source-in';
var ptrn = ctx2.createPattern(img, 'repeat');
ctx2.fillStyle = ptrn;
ctx2.fillRect(0, 0, can2.width, can2.height);
}
`
我得到这个结果:
如您所见,整个对象都充满了我的纹理。枕头等的定义不再可见。是否可以让我的纹理成为一种透明蒙版?
我已经可以改变沙发的颜色了:
但我也希望能够在我的沙发上添加图案!
任何帮助将不胜感激,我已经为我的英语不好感到非常抱歉。
【问题讨论】:
-
1) 用你的图案填充画布。 2) 使用 globalCompositeOperation='luminosity' 并绘制沙发。 3) 使用 globalCompositeOperation='source-in' 并绘制沙发。也许玩 globalAlpha 来调制。这是您可以获得的最接近的结果:您需要一个 3D 模型/3D 渲染器来进行准确的纹理化。
-
@GameAlchemist 你可以使用亮度,但请记住,这是一种不可分离的模式,它必须通过 HSL,所以它的计算机负担要重得多(甚至如果它对后者使用了一些 Adobe 魔法)而不是使用简单的 Cb x Cs 的乘法。
-
@KenFyrstenberg :使用亮度不应该是一个问题 1)它是一次性计算 2)GPU 不会介意转换,并且 3)如果你手动做它会无论公式如何,都非常慢。但是在使用“亮度”和接近 0.5 的 alpha 测试您的代码之后,使用乘法的最佳理由是......它看起来更好!
-
@GameAlchemist 这不是问题,只是计算量更大(如果在此处的定制器中大量使用它,或者客户端在较慢的计算机上,则可能会成为问题)。 OP可以考虑到需要优化的东西。是的,同意,手动乘法 (IE) 在任何一种情况下都会很慢。
标签: javascript canvas html5-canvas drawing mask