Javascript HTML画布-形状之间的颜色转换(形状不重叠)
图像是我期待使用html画布,而不使用模糊或阴影来实现的 问题: 有并没有办法从图像的左侧部分实现图像的右侧部分 这道题的重点是(基础图)Javascript HTML画布-形状之间的颜色转换(形状不重叠),javascript,html5-canvas,Javascript,Html5 Canvas,图像是我期待使用html画布,而不使用模糊或阴影来实现的 问题: 有并没有办法从图像的左侧部分实现图像的右侧部分 这道题的重点是(基础图) var canvas=document.createElement('canvas'), d=canvas.width=canvas.height=400, sq_尺寸=d/10, ctx=canvas.getContext('2d'); document.body.appendChild(画布); var color=[“rgb(10110,10)”,“
var canvas=document.createElement('canvas'),
d=canvas.width=canvas.height=400,
sq_尺寸=d/10,
ctx=canvas.getContext('2d');
document.body.appendChild(画布);
var color=[“rgb(10110,10)”,“rgb(81169255)”,“rgb(81239255)”,
“rgb(81255202)”,
"rgb(81255132),"rgb(99255,81),"rgb(169255,81),,
"rgb(239255,81),"rgb(255202,81),"rgb(255132,81)";;
var x=0,len=color.length;
对于(变量i=0;i
无需实施模糊即可获得的最接近距离
可以使用图像平滑来模糊分辨率非常低的图像。然后使用
例子
pixelSize
控制模糊量。值1是最大值,并且随着该值变大而变小。必须是整数值,例如1、2、3、4、
注:结果将因所使用的设备和浏览器/版本而异
requestAnimationFrame(animationLoop);
const size=canvas.width;
const ctx=canvas.getContext('2d');
var mix=123;//相当于过渡
常量transitionTime=2;//每次转换秒数
常量样例=[0,1,2];
常量像素大小=2;
//eCurve p=1线性曲线[默认p=2]是二次曲线p=3三次曲线,依此类推。
常数eCurve=(v,p=2)=>v<0?0:v>1?1:v**p/(v**p+(1-v)**p);
常数cols=[
[10, 110, 10], [81, 169, 255], [81, 239, 255], [81, 255, 202], [81, 255, 132],
[99, 255, 81], [169, 255, 81], [239, 255, 81], [255,202, 81], [255,132,81]
];
const img=document.createElement(“画布”);
img.height=img.width=swatches.length*像素大小;
常量imgCtx=img.getContext('2d');
函数随机样本(){
swatches.forEach(y=>{swatches.forEach(x=>{
imgCtx.fillStyle=“rgb(“+cols[Math.random()*cols.length | 0”)。连接(“,”+”);
imgCtx.fillRect(x*pixelSize,y*pixelSize,pixelSize,pixelSize);
}); });
}
函数animationLoop(){
混合=(混合>=4?(随机样本(),0):混合)+1/(过渡时间*60);
ctx.globalAlpha=1;
ctx.imageSmoothingEnabled=假;
ctx.drawImage(img,0,0,size,size);
ctx.imageSmoothingEnabled=真;
常数a=混合物%2;
ctx.globalAlpha=eCurve(a>1?2-a:a,3);
ctx.drawImage(img,0,0,size,size);
requestAnimationFrame(animationLoop);
}
无需实施模糊即可获得的最近距离
可以使用图像平滑来模糊分辨率非常低的图像。然后使用
例子
pixelSize
控制模糊量。值1是最大值,并且随着该值变大而变小。必须是整数值,例如1、2、3、4、
注:结果将因所使用的设备和浏览器/版本而异
requestAnimationFrame(animationLoop);
const size=canvas.width;
const ctx=canvas.getContext('2d');
var mix=123;//相当于过渡
常量transitionTime=2;//每次转换秒数
常量样例=[0,1,2];
常量像素大小=2;
//eCurve p=1线性曲线[默认p=2]是二次曲线p=3三次曲线,依此类推。
常数eCurve=(v,p=2)=>v<0?0:v>1?1:v**p/(v**p+(1-v)**p);
常数cols=[
[10, 110, 10], [81, 169, 255], [81, 239, 255], [81, 255, 202], [81, 255, 132],
[99, 255, 81], [169, 255, 81], [239, 255, 81], [255,202, 81], [255,132,81]
];
const img=document.createElement(“画布”);
img.height=img.width=swatches.length*像素大小;
常量imgCtx=img.getContext('2d');
函数随机样本(){
swatches.forEach(y=>{swatches.forEach(x=>{
imgCtx.fillStyle=“rgb(“+cols[Math.random()*cols.length | 0”)。连接(“,”+”);
imgCtx.fillRect(x*pixelSize,y*pixelSize,pixelSize,pixelSize);
}); });
}
函数animationLoop(){
混合=(混合>=4?(随机样本(),0):混合)+1/(过渡时间*60);
ctx.globalAlpha=1;
ctx.imageSmoothingEnabled=假;
ctx.drawImage(img,0,0,size,size);
ctx.imageSmoothingEnabled=真;
常数a=混合物%2;
ctx.globalAlpha=eCurve(a>1?2-a:a,3);
ctx.drawImage(img,0,0,size,size);
requestAnimationFrame(animationLoop);
}
这个解决方案最适合我。符合我的大数据集。
不是O(1),我也不可能认为它是,甚至是O(n)(小玩笑)
注意:代码可以进一步优化
拨弄
var canvas=document.createElement('canvas'),
d=canvas.width=canvas.height=250,
sq_尺寸=d/5,
ctx=canvas.getContext('2d');
document.body.appendChild(画布);
setAttribute('id','cav');
var color=[“rgb(10110,10)”,“rgb(81169255)”,“rgb(81239255)”,“rgb(81255202)”,“rgb(81255132)”,“rgb(99255,81)”,“rgb(169255,81)”,“rgb(239255,81)”,“rgb(255202,81)”,“rgb(255132,81)”;
var x=0,len=color.length;
var-prevcolorh;
var colorobj={};
对于(var i=0;ivar canvas = document.createElement('canvas'),
d = canvas.width = canvas.height = 400,
sq_size = d / 10,
ctx = canvas.getContext('2d');
document.body.appendChild(canvas);
var color=["rgb(10,110,10)", "rgb(81,169,255)","rgb(81,239,255)",
"rgb(81,255,202)",
"rgb(81,255,132)","rgb(99,255,81)","rgb(169,255,81)",
"rgb(239,255,81)", "rgb(255,202,81)","rgb(255,132,81)"];
var x=0, len=color.length;
for(var i=0; i < d; i++){
while(x < d) {
var c = Math.floor(Math.random() * len);
ctx.fillStyle = color[c];
ctx.fillRect(x,i,sq_size,sq_size);
x = x + sq_size;
}
x = 0;
i = i+sq_size;
}
var canvas = document.createElement('canvas'),
d = canvas.width = canvas.height = 250,
sq_size = d / 5,
ctx = canvas.getContext('2d');
document.body.appendChild(canvas);
canvas.setAttribute('id','cav');
var color=["rgb(10,110,10)", "rgb(81,169,255)","rgb(81,239,255)", "rgb(81,255,202)", "rgb(81,255,132)","rgb(99,255,81)","rgb(169,255,81)", "rgb(239,255,81)", "rgb(255,202,81)","rgb(255,132,81)"];
var x=0, len=color.length;
var prevcolorh;
var colorobj = {};
for(var i=0; i < d;){
colorobj[i] = {};
while(x < d) {
var c = Math.floor(Math.random() * len);
colorobj[i][x] = color[c];
var gradient = ctx.createLinearGradient(x, 0, x+sq_size, 0);
var a = (prevcolorh !== undefined) ? prevcolorh : colorobj[i][x];
gradient.addColorStop(0, a);
gradient.addColorStop(1, colorobj[i][x]);
prevcolorh = colorobj[i][x];
ctx.fillStyle = gradient;
ctx.fillRect(x, i, d, d);
x = x + sq_size;
}
x = 0;
i = i+sq_size;
}
var rgbs = {};
for(var i=0; i<d; i+=sq_size) {
var imgd = ctx.getImageData(0, i+(sq_size/2), d, sq_size);
rgbs[i] = {};
var arr = [];
for (var j = 0, c = 0, n = imgd.data.length; j < n; j += 4, c++) {
if(j > 0 && j < d*4) {
arr.push([imgd.data[j],imgd.data[j+1],imgd.data[j+2],imgd.data[+3]]);
}
}
rgbs[i] = arr;
}
for(var k in rgbs) {
for(var i=0; i<rgbs[k].length; i++) {
if(rgbs[parseInt(k)+sq_size] !== undefined) {
var gradient2 = ctx.createLinearGradient(0, parseInt(k)+(sq_size/2), 0, parseInt(k)+(sq_size/2) + sq_size);
gradient2.addColorStop(0, 'rgba('+rgbs[k][i].join(',')+')');
gradient2.addColorStop(1, 'rgba('+rgbs[parseInt(k)+sq_size][i].join(',')+')');
ctx.fillStyle = gradient2;
ctx.fillRect(i, parseInt(k)+(3*sq_size/4), 1, sq_size/2);
}
}
}