另一个stackoverflow问题的解决方案帮助了我:
https://jsfiddle.net/87nw05kz/
const canvas = document.getElementById("testcanvas");
const context = canvas.getContext("2d");
const colors = [{x:10,y:10,r:255,g:0,b:0},
{x:190,y:10,r:0,g:127,b:0},
{x:100,y:190,r:0,g:0,b:255},
{x:200,y:100,r:0,g:0,b:0},
{x:190,y:190,r:127,g:255,b:127}];
function distance(x1, y1, x2, y2) {
let dx = x1 - x2;
let dy = y1 - y2;
return Math.sqrt(dx * dx + dy * dy);
}
function calculateColor(x, y) {
let total = 0;
for (let i = 0; i < colors.length; i++) {
let c = colors[i];
let d = distance(c.x, c.y, x, y);
if (d === 0) {
return c;
}
d = 1 / (d * d);
c.d = d;
total += d;
}
let r = 0, g = 0, b = 0;
for (let i = 0; i < colors.length; i++) {
let c = colors[i];
let ratio = c.d / total;
r += ratio * c.r;
g += ratio * c.g;
b += ratio * c.b;
}
r = Math.floor(r);
g = Math.floor(g);
b = Math.floor(b);
return {r:r,g:g,b:b};
}
function processImage() {
const imgData = context.getImageData(0, 0, canvas.width, canvas.height);
const pixels = imgData.data;
const width = canvas.width;
const height = canvas.height;
const count = width * height * 4;
for (let i = 0; i < count; i += 4) {
let x = (i / 4) % width;
let y = Math.floor(i / 4 / width);
let color = calculateColor(x, y);
pixels[i] = color.r;
pixels[i+1] = color.g;
pixels[i+2] = color.b;
pixels[i+3] = 255;
}
context.putImageData(imgData, 0, 0);
}
processImage();