【发布时间】:2014-02-08 09:37:13
【问题描述】:
有问题的项目:https://github.com/matutter/Pixel2 是一个个人项目,用于替换工作中的一些过时软件。它应该做的是,用户添加图像并生成图像的调色板。调色板不应有重复的颜色。 (这是唯一重要的东西)
我的问题是:为什么较大、高分辨率或复杂的图像不能正常工作? (颜色数据丢失)
使用 dropzone.js,我让用户在页面上放了一张图片。图片是缩略图。接下来我使用 jquery 从<img src="..."> 中查找 src。我将该 src 传递给执行此操作的函数
function generate(imgdata) {
var imageObj = new Image();
imageObj.src = imgdata;
convert(imageObj); //the function that traverses the image data pulling out RGB
}
“转换”功能相当简单地通过
for(var i=0, n=data.length; i<n; i+=4, pixel++ ) {
r = data[i];
g = data[i+1];
b = data[i+2];
color = r + g + b; // format is a string of **r, g, b**
}
最后,主要算法的最后一部分过滤掉重复的颜色,我只想要每个出现 1 次...这是最后一部分
color = monoFilter(color); // the call
function monoFilter(s) {
var unique = [];
$.each(s, function(i, el){
if($.inArray(el, unique) === -1) unique.push(el);
});
unique.splice(0,1); //remove undefine
unique.unshift("0, 0, 0"); //make sure i have black
unique.push("255, 255, 255"); //and white
return unique;
}
我希望有人能帮我找出大文件中颜色数据丢失的原因。
如果有人真的很有趣可以看看 github,relivent 文件是 js/pixel2.js、js/dropzone.js 和 ../index.html
【问题讨论】:
-
也许我理解错了,但为什么不在第一遍将颜色存储在关联数组中呢?
allColors[r + g + b]=1 -
问题是如果图像很大,为什么这个过程不能找到所有颜色。然而,这不是一个坏主意,几乎可以跳过删除重复项的需要。
-
它应该完全跳过删除重复项的需要,因为这将由存储的性质完成。
-
是的,完全!但我也使用该数组不仅生成调色板,我还将使用包含所有像素和颜色信息的未排序版本的数组来生成特殊的类似二进制的图像格式。
-
你也可以从关联数组构建一个真正的数组。
标签: node.js html5-canvas dropzone.js color-palette