- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 related question几个月前关于通过合成 (HTML5 Canvas) 为 Canvas 着色。当我再次遇到它时,我确实以某种方式理解了它是如何工作的。但我今天的问题是,是否可以通过单选按钮更改绘制像素的分层,而不会影响已选择颜色的其他图层?
为了理解我在说什么,我创建了一个工作 JSFIDDLE . (抱歉乱七八糟的 CSS)
解释 Fiddle:我目前拥有的是,我可以更改示例图像的背景颜色和中心的花。现在,如果您单击灰色按钮“更改中心图像”,将出现一个模式,显示 2 个示例中心图像,花和爪子。我想要实现的是根据模态上的所选项目更改先前绘制的 Canvas (即花)。假设我单击爪子图像,我应该能够看到爪子而不是花。所选的背景颜色不得受到影响。
这可能吗?如果不行,还有别的办法吗?
所以这是我的 JavaScript:
var cvs = document.getElementById("canvas");
var ctx = cvs.getContext("2d");
var centerImgDefaultColor = "#f6de16";
var baseColor = "#d85700";
var imageURLs = [];
var imagesOK = 0;
var imgs = [];
var images = ["http://s23.postimg.org/y8hbni44b/base.png","http://s10.postimg.org/592v9dsd5/flower.png","http://s10.postimg.org/592v9dsd5/flower.png"];
for (var i = 0; i < images.length; i++) {
imageURLs.push(images[i]);
}
loadAllImages();
function loadAllImages() {
for (var i = 0; i < imageURLs.length; i++) {
var img = new Image();
imgs.push(img);
img.onload = function () {
imagesOK++;
imagesAllLoaded();
};
img.src = imageURLs[i];
}
}
var imagesAllLoaded = function () {
if (imagesOK >= imageURLs.length) {
base = imgs[0];
paw = imgs[1];
overlay = imgs[2];
draw();
}
};
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.save();
ctx.drawImage(overlay, 0, 0);
ctx.fillStyle = centerImgDefaultColor;
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.globalCompositeOperation = "destination-atop";
ctx.drawImage(paw, 0, 0);
ctx.drawImage(base, 0, 0);
ctx.fillStyle = baseColor;
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.globalCompositeOperation = "destination-atop";
ctx.restore();
}
$(".paw").click(function () {
centerImgDefaultColor = '#' + $( this ).attr( "value" );
draw();
});
$(".base").click(function () {
baseColor = '#' + $( this ).attr( "value" );
draw();
});
还有我的 HTML:
<div style="float:left;">
<p>Background Color</p>
<div class="base" style="width:25px;height:25px;background-color:#000000;" value="000000"></div>
<div class="base" style="width:25px;height:25px;background-color:#7da7de;" value="7da7de"></div>
<div class="base" style="width:25px;height:25px;background-color:#d85700;" value="d85700"></div>
</div>
<div style="float:right;">
<p>Center Image Color</p>
<div class="paw" style="width:25px;height:25px;background-color:#040054;" value="040054"></div>
<div class="paw" style="width:25px;height:25px;background-color:#267d00;" value="267d00"></div>
<div class="paw" style="width:25px;height:25px;background-color:#f6de16;" value="f6de16"></div>
</div>
<a class="button" href="">Change center image</a>
<div id="modal">
<a href="" class="close">×</a>
<input type="radio" class="btn-img" name="imageLayout" value="flower" checked="checked"/><img src="http://s10.postimg.org/6j3y3l979/prev_flower.png"/>
<input type="radio" class="btn-img" name="imageLayout" value="paw"/><img src="http://s1.postimg.org/gtmv5giwr/prev_paw.png"/>
</div>
<div class="modal-bg"></div>
<canvas id="canvas" width=310 height=450></canvas>
一开始我实际上是在考虑获取单选按钮的值并通过点击函数将其加载到我的图像数组中,但我认为这是不可能的。
$(".btn-img").click(function() { var val =
$('input[name="imageLayout"]:checked').val();
});
所以我想在我的 JS 中使用这样的东西(假设图像来 self 的服务器,所以我使用图像的直接名称):
var selectedimageLayout = $('input[name="imageLayout"]:checked').val();
var imageLayoutSample = selectedimageLayout + ".png";
并将其传递给我的图像数组:
var images = ["http://s23.postimg.org/y8hbni44b/base.png",imageLayoutSample ,imageLayoutSample];
但是当我点击一个单选按钮时,我不能让它动态地改变。
我将非常感谢任何意见、建议或答案。谢谢。
最佳答案
您可以使用此 jQuery 选择器监听模式单选按钮上的点击:
#modal input[type=radio]
然后根据单击的单选按钮重绘场景:
$('#modal input[type=radio]').click(function(){
var imageName=$(this).val();
if(imageName=='paw'){
// draw the paw in the specified colors
}else if(imageName=='flower'){
// draw the flower in the specified colors
}
});
[ 补充:使用合成来合成图像 + 背景 ]
这是一个重绘函数,它接受一个图像对象、背景色和前景色,并使用合成为具有指定背景的图像对象重新着色:
function redraw(img,background,foreground){
ctx.clearRect(0,0,canvas.width,canvas.height);
ctx.drawImage(img,0,0);
ctx.globalCompositeOperation='source-in';
ctx.fillStyle=foreground;
ctx.fillRect(0,0,canvas.width,canvas.height);
ctx.globalCompositeOperation='destination-over';
ctx.fillStyle=background;
ctx.fillRect(0,0,canvas.width,canvas.height);
ctx.globalCompositeOperation='source-over';
}
关于javascript - 合成:如何根据单选按钮中的选定选项动态更改 Canvas 新绘图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32325581/
组成:一个类可以将其他类的对象作为成员进行引用。这称为合成,有时也称为具有关系。 由Deitel P.J.,Deitel H.M. -Java如何编程第9版。 在本主题中讨论了这种观点: Prefer
好的,最近我开始关注类,继承,接口(interface)以及它们之间如何交互。在此期间,我在各种论坛/博客/视频上发现了对继承的普遍不屑一顾,并且青睐作曲。好吧,酷一些新东西要学习。通过使用this
如果我有这样的选择语句 SELECT t.time, AS ticks, as num FROM MyTable t; 我可以使用第2列中的计算值作为第3列中计算的基础吗?
我正在使用为我的 HTML 文件启用的 Syntastic。由于我有一个非常大的文件,并且启用了“validator w3”检查器,因此在保存文件时 GVIM 或 VIM 变得非常慢 (:w)。 是否
我正在尝试实现预乘 alpha 混合。在这个页面上:What Is Color Blending? ,他们确实解释了标准的 alpha 混合,但没有解释预乘值。 Alpha 混合:(源 × Blend
我正在尝试打开几个无框架的弹出窗口(顶级)。我可以通过以下方式实现这一目标: window.setWindowFlags(Qt.FramelessWindowHint | Qt.Dialog) 但问题
我们通常知道一个类cannot be unloaded来自 ClassLoader,但 lambda 的合成类似乎可以。 证明: public class Play { static Stri
我正在尝试使用 C 中的相位累加器实现带反馈的 FM 合成运算符。在 Tomisawa 的 original patent 中,进入加法器的相位累加器对负索引和正索引进行计数,从 -pi 正弦波相位的
我正在尝试使用 Canvas 在 HTML5 中重新创建翻页类型的动画。动画基于 this page 的想法.但这并不重要。我遇到的问题是使用“source-in”复合操作没有给我预期的结果,我想澄清
我想在顶栏下方添加一个水平分隔线,如下所示: 我使用的是 Material 3,但无法解析分隔线。这是我的依赖项: dependencies { implementation 'androi
我想在顶栏下方添加一个水平分隔线,如下所示: 我使用的是 Material 3,但无法解析分隔线。这是我的依赖项: dependencies { implementation 'androi
使用 Synth LaF,我无法将 JLabel 的前景颜色设置为“禁用”状态。有人成功做到这一点吗?这是 LaF.xml 文件中标签的样式定义。
我需要对 2 个大小不同的图像进行 alpha 混合。我已经设法通过将大小调整为相同大小来将它们组合起来,因此我已经得到了部分逻辑: import cv2 as cv def combine_two_
我有一个 related question几个月前关于通过合成 (HTML5 Canvas) 为 Canvas 着色。当我再次遇到它时,我确实以某种方式理解了它是如何工作的。但我今天的问题是,是否可以
我需要执行 Source In composition在 2 张图片上。 例如这张图片: 和蒙版图像(用黑色透明和黑白测试): 应该产生结果: 我正在尝试使用 ImageSharp 来做到这一点: i
我是 Objective-C 的新手,我想知道是否有一种简单的方法可以将 id 设置为对象实例(具有合成属性),并直接获取/设置这些属性,例如: id myID = myInstance; myID.
我有一个使用 fragment 来更改 View 而不是启动新 Activity 的 Activity 。假设我有 3 个 fragment A、B 和 C。当应用程序启动时,默认 fragment
我是 kotlin 的新手。我发现并尝试在我的 Activity 类中使用合成方法而不是烦人的方法 findViewById,但我发现“如果我们想在 View 上调用合成属性(有用在适配器类中),我们
我正在使用 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)对于文档所说的 alpha 组合(实际上在 Direct3D 文档中也说了同样的事情)。
我正在使用下面的代码来合并两个 UIImage, 不知道是否有更快的方法。 - (UIImage*) combineImage: (UIImage*) aImage { UIGraphicsB
我是一名优秀的程序员,十分优秀!