- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在绘制一个未被清除的 Canvas ,并使 Canvas 随着时间的推移逐渐变成纯色,或者在 alpha 中逐渐消失以显示后面的图层。
我的第一直觉是简单地用每帧的低 alpha 在绘图上填充一个矩形,这样填充颜色就会逐渐累积并淡出绘图。
但我发现了一些奇怪的行为(至少对我来说,我确信这是有原因的)。填充颜色永远不会完全累积。结果会根据油漆和填充颜色是否比彼此更亮/更暗而变化。
我发现这个问题有人和我做同样的事情:fade out lines after drawing canvas?
顶部的答案看起来不错,和我试过的一样。但它只适用于白底黑字。这是同一个 fiddle 的不同颜色的另一个版本,你会看到绘图永远不会消失,它留下了一个幽灵:http://jsfiddle.net/R4V97/92/
var canvas = document.getElementById("canvas"),
ctx = canvas.getContext("2d"),
painting = false,
lastX = 0,
lastY = 0;
canvas.width = canvas.height = 600;
canvas.onmousedown = function (e) {
if (!painting) {
painting = true;
} else {
painting = false;
}
lastX = e.pageX - this.offsetLeft;
lastY = e.pageY - this.offsetTop;
};
canvas.onmousemove = function (e) {
if (painting) {
mouseX = e.pageX - this.offsetLeft;
mouseY = e.pageY - this.offsetTop;
ctx.strokeStyle = "rgba(255,255,255,1)";
ctx.beginPath();
ctx.moveTo(lastX, lastY);
ctx.lineTo(mouseX, mouseY);
ctx.stroke();
lastX = mouseX;
lastY = mouseY;
}
}
function fadeOut() {
ctx.fillStyle = "rgba(60,30,50,0.2)";
ctx.fillRect(0, 0, canvas.width, canvas.height);
setTimeout(fadeOut,100);
}
fadeOut();
此外,如果您将填充不透明度更改为 0.01,并将时间更改为 20 毫秒,它甚至不会填充正确的颜色,而是保持灰色。
我尝试过的其他事情都存在同样的根本问题。我试过在两个 Canvas 之间弹跳,使用 Canvas A 并使用减少的 alpha 将其绘制到 Canvas B,然后再将 Canvas B 画回 Canvas A - 同样的问题,有一个阈值不会消失。
作为测试,我什至尝试了获取图像数据的超慢操作,遍历所有像素 alpha channel 并乘以 0.95,然后再将数据放回原处。它仍然留下了阴影,我必须在循环中做这样的事情(由于某种原因它甚至从未低于 10):
if (alpha<25) {
alpha = 0;
}
我在想我也许可以将 Canvas 分成一个网格或几行,并在每帧一个单元格中执行 imageData 操作,这在低淡入淡出时间时可能不会引人注意。
但是,如果有人知道更好的方法或者我没有得到的核心内容是什么,我将不胜感激!
最佳答案
您需要避免接触 RGB channel ,因为当您对 8 位值进行数学运算时,结果会出现巨大错误。例如(8 位整数数学)14 * 0.1 = 1、8 * 0.1 = 1 因此,当您在现有像素上绘制时,您将得到一个舍入误差,该误差对于每个 channel 都不同,具体取决于您在顶部绘制的颜色。
没有完美的解决方案,但您可以通过使用全局复合操作“destination-out”来避免颜色 channel 并仅淡化 alpha channel 这将通过减少像素 alpha 来淡出渲染。
适用于低至 globalAlpha = 0.01 甚至更低一点的 0.006 的淡入淡出率,但低于该值可能会很麻烦。然后,如果您需要更慢的淡入淡出,只需每第 2 或第 3 帧进行一次淡入淡出。
ctx.globalAlpha = 0.01; // fade rate
ctx.globalCompositeOperation = "destination-out" // fade out destination pixels
ctx.fillRect(0,0,w,h)
ctx.globalCompositeOperation = "source-over"
ctx.globalAlpha = 1; // reset alpha
请注意,这会将 Canvas 淡化为透明。如果您希望渐变朝着特定颜色发展,您需要将渐变 Canvas 保持为单独的屏幕外 Canvas ,并将其绘制在具有要渐变到的所需背景的 Canvas 上。
var canvas = document.createElement("canvas");
canvas.width = 1024;
canvas.height = 1024;
var ctx = canvas.getContext("2d");
var w = canvas.width;
var h = canvas.height;
document.body.appendChild(canvas);
var fadCan = document.createElement("canvas");
fadCan.width = canvas.width;
fadCan.height = canvas.height;
var fCtx = fadCan.getContext("2d");
var cw = w / 2; // center
var ch = h / 2;
var globalTime;
function randColour(){
return "hsl("+(Math.floor(Math.random()*360))+",100%,50%)";
}
var pps = [];
for(var i = 0; i < 100; i ++){
pps.push({
x : Math.random() * canvas.width,
y : Math.random() * canvas.height,
d : Math.random() * Math.PI * 2,
sp : Math.random() * 2 + 0.41,
col : randColour(),
s : Math.random() * 5 + 2,
t : (Math.random() * 6 -3)/10,
});
}
function doDots(){
for(var i = 0; i < 100; i ++){
var d = pps[i];
d.d += d.t * Math.sin(globalTime / (d.t+d.sp+d.s)*1000);
d.x += Math.cos(d.d) * d.sp;
d.y += Math.sin(d.d) * d.sp;
d.x = (d.x + w)%w;
d.y = (d.y + w)%w;
fCtx.fillStyle = d.col;
fCtx.beginPath();
fCtx.arc(d.x,d.y,d.s,0,Math.PI * 2);
fCtx.fill();
}
}
var frameCount = 0;
// main update function
function update(timer){
globalTime = timer;
frameCount += 1;
ctx.setTransform(1,0,0,1,0,0); // reset transform
ctx.globalAlpha = 1; // reset alpha
ctx.fillStyle = "hsl("+(Math.floor((timer/50000)*360))+",100%,50%)";
ctx.fillRect(0,0,w,h);
doDots();
if(frameCount%2){
fCtx.globalCompositeOperation = "destination-out";
fCtx.fillStyle = "black";
var r = Math.random() * 0.04
fCtx.globalAlpha = (frameCount & 2 ? 0.16:0.08)+r;
fCtx.fillRect(0,0,w,h);
fCtx.globalAlpha = 1;
fCtx.globalCompositeOperation = "source-over"
}
ctx.drawImage(fadCan,0,0)
requestAnimationFrame(update);
}
requestAnimationFrame(update);
点击拖动鼠标进行绘制。
var canvas = document.createElement("canvas");
canvas.width = 1024;
canvas.height = 1024;
var ctx = canvas.getContext("2d");
var w = canvas.width;
var h = canvas.height;
document.body.appendChild(canvas);
var fadCan = document.createElement("canvas");
fadCan.width = canvas.width;
fadCan.height = canvas.height;
var fCtx = fadCan.getContext("2d");
var cw = w / 2; // center
var ch = h / 2;
var globalTime;
function randColour(){
return "hsl("+(Math.floor(Math.random()*360))+",100%,50%)";
}
// main update function
function update(timer){
globalTime = timer;
ctx.setTransform(1,0,0,1,0,0); // reset transform
ctx.globalAlpha = 1; // reset alpha
ctx.fillStyle = "hsl("+(Math.floor((timer/150000)*360))+",100%,50%)";
ctx.fillRect(0,0,w,h);
if(mouse.buttonRaw === 1){
fCtx.strokeStyle = "White";
fCtx.lineWidth = 3;
fCtx.lineCap = "round";
fCtx.beginPath();
fCtx.moveTo(mouse.lx,mouse.ly);
fCtx.lineTo(mouse.x,mouse.y);
fCtx.stroke();
}
mouse.lx = mouse.x;
mouse.ly = mouse.y;
fCtx.globalCompositeOperation = "destination-out";
fCtx.fillStyle = "black";
fCtx.globalAlpha = 0.1;
fCtx.fillRect(0,0,w,h);
fCtx.globalAlpha = 1;
fCtx.globalCompositeOperation = "source-over"
ctx.drawImage(fadCan,0,0)
requestAnimationFrame(update);
}
var mouse = (function () {
function preventDefault(e) {
e.preventDefault();
}
var mouse = {
x : 0,
y : 0,
w : 0,
alt : false,
shift : false,
ctrl : false,
buttonRaw : 0,
over : false,
bm : [1, 2, 4, 6, 5, 3],
active : false,
bounds : null,
crashRecover : null,
mouseEvents : "mousemove,mousedown,mouseup,mouseout,mouseover,mousewheel,DOMMouseScroll".split(",")
};
var m = mouse;
function mouseMove(e) {
var t = e.type;
m.bounds = m.element.getBoundingClientRect();
m.x = e.pageX - m.bounds.left + scrollX;
m.y = e.pageY - m.bounds.top + scrollY;
m.alt = e.altKey;
m.shift = e.shiftKey;
m.ctrl = e.ctrlKey;
if (t === "mousedown") {
m.buttonRaw |= m.bm[e.which - 1];
} else if (t === "mouseup") {
m.buttonRaw &= m.bm[e.which + 2];
} else if (t === "mouseout") {
m.buttonRaw = 0;
m.over = false;
} else if (t === "mouseover") {
m.over = true;
} else if (t === "mousewheel") {
m.w = e.wheelDelta;
} else if (t === "DOMMouseScroll") {
m.w = -e.detail;
}
if (m.callbacks) {
m.callbacks.forEach(c => c(e));
}
if ((m.buttonRaw & 2) && m.crashRecover !== null) {
if (typeof m.crashRecover === "function") {
setTimeout(m.crashRecover, 0);
}
}
e.preventDefault();
}
m.addCallback = function (callback) {
if (typeof callback === "function") {
if (m.callbacks === undefined) {
m.callbacks = [callback];
} else {
m.callbacks.push(callback);
}
}
}
m.start = function (element) {
if (m.element !== undefined) {
m.removeMouse();
}
m.element = element === undefined ? document : element;
m.mouseEvents.forEach(n => {
m.element.addEventListener(n, mouseMove);
});
m.element.addEventListener("contextmenu", preventDefault, false);
m.active = true;
}
m.remove = function () {
if (m.element !== undefined) {
m.mouseEvents.forEach(n => {
m.element.removeEventListener(n, mouseMove);
});
m.element.removeEventListener("contextmenu", preventDefault);
m.element = m.callbacks = undefined;
m.active = false;
}
}
return mouse;
})();
mouse.start(canvas);
requestAnimationFrame(update);
关于javascript - 随时间褪色的 Canvas 绘画 |奇怪的阿尔法分层行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41483806/
我对 jQuery 还很陌生,但我正在寻找一个简单的脚本,通过淡入和淡出的方式在标题中循环 3 或 4 个背景图像。它们是透明的 png,因此我尝试过的许多 slider 都不起作用。 有什么想法吗?
我需要一个用 Java 编写的颜色褪色示例。我的要求是我有两个矩形。一个填充红色,另一个填充白色。当我点击任何按钮时,我希望红色开始褪色并移动绿色。一旦到达绿色位置,另一个矩形就会自动从黄蓝色开始。有
尝试设置 UIAlertController backgroundColor 但结果是“褪色”颜色 let alert = UIAlertController(title: "some title",
我正在尝试制作一个带有渐变 block 动画的 slider ,就像 here .问题是,在我的例子中,我试图全屏显示,这意味着高度和宽度将是可变的。这意味着背景位置技巧将不起作用,因为它不会调整背景
这是我想要的东西achieve . 类似于 this 的东西*但这会通过使用颜色而褪色。 Long wordingggggggggggggggggggggggggggggggggggg
我用 glColor3f() 和 GL_QUAD_STRIP 绘制了 2 个相邻的方 block ,但它们似乎在 2 个方 block 之间褪色,有什么办法可以防止这种情况发生吗?或者 GL_QUAD
我正在开发一个用户脚本,该脚本将缺失的功能添加到我无法控制的第 3 方网站。 它将根据页面和一些 webAPI 调用的结果计算 URL。这些 URL 将添加到页面的 HTML 中。 然后对于呈现为 :
我只是想在页面上有一个特定的部分来交换内容(比如 3 个不同的元素),并具有淡入淡出的效果。所以我想我可以为内容部分定义我的容器属性,然后我可以定义将换入和换出的 3 个 div 容器中的每一个。因此
我在 bootstrap carousel 上苦苦挣扎了几天,它应该像默认的那样向左/向右滑动,但增加了淡化(新元素进入时慢慢获得不透明度,而前一个元素在移出时慢慢失去不透明度),我尝试了很多变体,但
我对 Qt 的样式表功能有一些疑问。这真的很棒,但感觉这个功能还没有出现太久,真的吗?这是迄今为止最简单的方式来设置我的 GUI 样式。 是否可以在样式表中添加褪色?每当鼠标悬停在某个小部件上时,我不
我正在使用以下命令 ffmpeg -i ~/Desktop/input.mp4 -filter_complex "color=black:100x100[c];\ [c][0]scale2r
我正在尝试实现一个“返回顶部”链接,该链接会在用户向下滚动页面一定量后淡入我的页面。 我注意到在我的某些页面上,“返回顶部”链接会在页面上闪烁,然后再自行隐藏,但在其他页面上则不会。为了找出“链接闪烁
我想将 svg 文件加载到一个 div(或其他)中,我什至可以成功地做到这一点 here : var div_svg = d3.select("div#example"); svg1 = "https
我是一名优秀的程序员,十分优秀!