有没有办法在 html canvas 上生成随机对比度级别?
Is there a way to generate a random contrast level on html canvas?
我正在尝试将此形状呈现为行为实验中的刺激物。我希望图像具有介于 0 和 1 之间的随机对比度级别。我正在尝试为此使用 Math.random() 但是当我 运行 在 Chrome 中显示时,形状会闪烁屏幕上。有没有办法用随机生成的对比度来呈现稳定的形状?
drawFunc: function gabor() {
context = jsPsych.currentTrial().context;
context.beginPath();
const gradLength = 100;
const my_gradient = context.createLinearGradient(850, 0, 1050, 0);
my_gradient.addColorStop(0,'rgb(0, 0, 0)');
my_gradient.addColorStop(0.05,'rgb(255, 255, 255)');
my_gradient.addColorStop(0.1,'rgb(0, 0, 0)');
my_gradient.addColorStop(0.15,'rgb(255, 255, 255)');
my_gradient.addColorStop(0.2,'rgb(0, 0, 0)');
my_gradient.addColorStop(0.25,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.3,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.35,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.4,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.45,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.5,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.55,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.6,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.65,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.7,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.75,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.8,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.85,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.9,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.95,"rgb(255, 255, 255)");
my_gradient.addColorStop(1,"rgb(0, 0, 0)");
var result1 = Math.random();
context.filter = 'contrast('+ result1 +')';
context.fillStyle=my_gradient;
context.fillRect(950,300,gradLength,gradLength);
context.stroke();
使用设置函数获取常量
- 创建一次渐变
- 获取上下文一次。
使用函数创建一次对比度。参见示例
从绘图函数中删除设置代码。
从绘制函数中删除随机对比度值。
删除冗余代码
- 无需
context.beginPath();
,因为您使用fillRect
绘制
- 不需要
context.stroke()
。不确定你为什么调用 stroke 因为你在 beginPath
调用 之后没有定义路径
- 为什么要将命名函数
gabor
分配给对象 属性 drawFunc
您是使用其名称还是 属性 来调用该函数。无论您使用哪个,都会使另一个变得多余。
例子
setup() {
this.ctx = jsPsych.currentTrial().context;
const g = this.gradient = this.ctx.createLinearGradient(850, 0, 1050, 0);
const bands = 10, colors = ["#000", "#FFF"];
const stops = bands * colors.length;
var pos = 0;
while (pos <= stops) {
g.addColorStop(pos / stops, colors[pos % colors.length]);
pos++;
}
},
randomContrast() {
this.contrast = Math.Random();
this.drawFunc();
},
drawFunc() {
const ctx = this.ctx;
ctx.filter = 'contrast('+ this.contrast +')';
ctx.fillStyle = this.gradient;
ctx.fillRect(950, 300, 100, 100);
},
调用setup
一次,然后调用randomContrast
改变对比度。如果需要在不改变对比度的情况下重绘渐变调用drawFunc
我正在尝试将此形状呈现为行为实验中的刺激物。我希望图像具有介于 0 和 1 之间的随机对比度级别。我正在尝试为此使用 Math.random() 但是当我 运行 在 Chrome 中显示时,形状会闪烁屏幕上。有没有办法用随机生成的对比度来呈现稳定的形状?
drawFunc: function gabor() {
context = jsPsych.currentTrial().context;
context.beginPath();
const gradLength = 100;
const my_gradient = context.createLinearGradient(850, 0, 1050, 0);
my_gradient.addColorStop(0,'rgb(0, 0, 0)');
my_gradient.addColorStop(0.05,'rgb(255, 255, 255)');
my_gradient.addColorStop(0.1,'rgb(0, 0, 0)');
my_gradient.addColorStop(0.15,'rgb(255, 255, 255)');
my_gradient.addColorStop(0.2,'rgb(0, 0, 0)');
my_gradient.addColorStop(0.25,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.3,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.35,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.4,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.45,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.5,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.55,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.6,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.65,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.7,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.75,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.8,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.85,"rgb(255, 255, 255)");
my_gradient.addColorStop(0.9,"rgb(0, 0, 0)");
my_gradient.addColorStop(0.95,"rgb(255, 255, 255)");
my_gradient.addColorStop(1,"rgb(0, 0, 0)");
var result1 = Math.random();
context.filter = 'contrast('+ result1 +')';
context.fillStyle=my_gradient;
context.fillRect(950,300,gradLength,gradLength);
context.stroke();
使用设置函数获取常量
- 创建一次渐变
- 获取上下文一次。
使用函数创建一次对比度。参见示例
从绘图函数中删除设置代码。 从绘制函数中删除随机对比度值。
删除冗余代码
- 无需
context.beginPath();
,因为您使用fillRect
绘制
- 不需要
context.stroke()
。不确定你为什么调用 stroke 因为你在beginPath
调用 之后没有定义路径
- 为什么要将命名函数
gabor
分配给对象 属性drawFunc
您是使用其名称还是 属性 来调用该函数。无论您使用哪个,都会使另一个变得多余。
例子
setup() {
this.ctx = jsPsych.currentTrial().context;
const g = this.gradient = this.ctx.createLinearGradient(850, 0, 1050, 0);
const bands = 10, colors = ["#000", "#FFF"];
const stops = bands * colors.length;
var pos = 0;
while (pos <= stops) {
g.addColorStop(pos / stops, colors[pos % colors.length]);
pos++;
}
},
randomContrast() {
this.contrast = Math.Random();
this.drawFunc();
},
drawFunc() {
const ctx = this.ctx;
ctx.filter = 'contrast('+ this.contrast +')';
ctx.fillStyle = this.gradient;
ctx.fillRect(950, 300, 100, 100);
},
调用setup
一次,然后调用randomContrast
改变对比度。如果需要在不改变对比度的情况下重绘渐变调用drawFunc