来自 SVG
此解决方案使用浏览器解析/提取所有存在的颜色。您应该按照以下步骤操作:
这个想法是遍历所有元素并使用getComputedStyle(),然后使用像/(.*)(rgb\([0-9, ]*\))(.*)/g 这样的正则表达式只提取像rgb(n, n, n) 这样的值,执行另一个循环,如下所示:
var doc = document.getElementsByTagName("*");
var colors = [];
for (let j = 0; j < doc.length; j++) {
var styles = window.getComputedStyle(doc[j], null)
for (let i = 0; i < styles.length; i++) {
if (typeof styles[styles[i]] !== "undefined" && styles[styles[i]].match(/rgb\([0-9, ]*\)/g)) {
let color = styles[styles[i]].replace(/(.*)(rgb\([0-9, ]*\))(.*)/g,"$2")
if (!colors.includes(color))
colors.push(color);
}
}
}
console.log(colors)
此处的完整功能示例:https://jsfiddle.net/gwd35Lyv/ 和 https://jsfiddle.net/oenmL4t6/ 一个空文档,您可以在其中包含创建的 svg。
这是假设我们使用的是浏览器,而不是将 JavaScript 嵌入到 Illustrator 文件中。
你也可以用浏览器打开svg文件,像https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/AJ_Digital_Camera.svg按F12,在控制台中粘贴js代码。
来自图片
以前的解决方案不计算图像中存在的颜色,因为我们必须逐个像素地读取,以基于此How to get a pixel's x,y coordinate color from an image? 执行此操作。我们可以这样做:
var img = document.getElementById('my-image');
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);
var rect = img.getBoundingClientRect();
var colors = [];
for (let y = rect.top; y <= rect.left; y++) {
for (let x = rect.left; x <= rect.right; x++) {
var pixelData = canvas.getContext('2d').getImageData(x, y, 1, 1).data;
var rgb = "rgb(" + pixelData[0] + ", " + pixelData[1] + ", " + pixelData[2] + ")"
if (!colors.includes(rgb)) {
colors.push(rgb);
}
}
}
console.log(colors)
这里是一个例子:http://jsfiddle.net/vkq0ew9n/ 限制是图像应该在同一个来源(本地不起作用,只是 http: https: 等,而不是文件:)。