【发布时间】:2019-12-12 05:37:18
【问题描述】:
我正在开发一个简单的网络应用程序,它将上传图像的颜色简化为用户选择的调色板。该脚本有效,但循环整个图像需要很长时间(对于大图像,它需要几分钟),改变像素。
最初,我正在写入画布本身,但我更改了代码,以便对ImageData 对象进行更改,并且画布仅在脚本末尾更新。但是,这并没有太大的区别。
// User selects colours:
colours = [[255,45,0], [37,36,32], [110,110,105], [18,96,4]];
function colourDiff(colour1, colour2) {
difference = 0
difference += Math.abs(colour1[0] - colour2[0]);
difference += Math.abs(colour1[1] - colour2[1]);
difference += Math.abs(colour1[2] - colour2[2]);
return(difference);
}
function getPixel(imgData, index) {
return(imgData.data.slice(index*4, index*4+4));
}
function setPixel(imgData, index, pixelData) {
imgData.data.set(pixelData, index*4);
}
data = ctx.getImageData(0,0,canvas.width,canvas.height);
for(i=0; i<(canvas.width*canvas.height); i++) {
pixel = getPixel(data, i);
lowestDiff = 1024;
lowestColour = [0,0,0];
for(colour in colours) {
colour = colours[colour];
difference = colourDiff(colour, pixel);
if(lowestDiff < difference) {
continue;
}
lowestDiff = difference;
lowestColour = colour;
}
console.log(i);
setPixel(data, i, lowestColour);
}
ctx.putImageData(data, 0, 0);
在整个过程中,网站完全冻结,所以我什至无法显示进度条。有什么办法可以优化它以减少时间吗?
【问题讨论】:
标签: javascript jquery canvas html5-canvas