是否有可以从图像生成调色板的 js 库?

Posted

技术标签:

【中文标题】是否有可以从图像生成调色板的 js 库?【英文标题】:Is there a js library can can generate a color palette from an image? 【发布时间】:2012-01-15 07:22:36 【问题描述】:

可能会做类似的事情

<img  class="image" ... />

$(".image").get_colors()

我知道很少有网站可以上传你的图片,它会为你生成颜色,但我想在我的网站上放一些东西

类似于this 的东西,您可以在其中看到从屏幕截图生成的颜色,并且可以按颜色进行搜索。我试图检查源代码,但看不到对 js 库的任何引用。

如果可能的话,我需要这个功能来使用 js。

编辑: 图像已经在页面上;我只需要生成它的颜色,所以我不想要上传功能。

谢谢。

【问题讨论】:

不不,不上传。只需从页面中的图像中获取颜色 只需在画布元素上绘制图像并自行检查。不知道您对get_colors 的返回有何期望。 以前没有使用过画布(我最近开始看 html5)所以我要试一试 - 你知道任何可能涵盖你正在谈论的效果的资源@Prusse 【参考方案1】:

我写只是为了好玩。它是一个 jquery 插件,如果你不使用它,你可以阅读它以获得一些指针。如果在调用get_colors 的过程中出现一些错误,则在返回值中设置一个数组来保存错误,它会返回一个对象数组,这些对象是图像的直方图(每个选定元素的数组中的一项)。

(function($, window, document, undefined)
    var canvas = document.createElement('canvas');
    if (canvas && canvas.getContext)
        $.fn.get_colors = function()
            var rv = [];
            this.each(function()
                var tagname = this.tagName.toLowerCase();
                if ((tagname === 'img') || (tagname === 'canvas') || (tagname === 'video'))
                    //something bad can happend when drawing the image
                    try
                        var w = this.getAttribute('width');
                        var h = this.getAttribute('height');
                        canvas.setAttribute('width', w);  
                        canvas.setAttribute('height', h); 
                        var ctxt = canvas.getContext('2d');
                        if (ctxt)
                            ctxt.drawImage(this, 0, 0);
                            var imagedata = ctxt.getImageData(0, 0, w, h);
                            var data = imagedata.data;
                            //log('imagedata.width:'+imagedata.width+' imagedata.height:'+imagedata.height+' w:'+w+' h:'+h);
                            var obj = ;
                            var color = '';
                            var r = 0, g = 0, b = 0, a = 0;
                            var pix = data.length;
                            for (pix--; pix > 2; pix-=4)
                                //a = data[pix - 0];
                                b = data[pix - 1];
                                g = data[pix - 2];
                                r = data[pix - 3];
                                if (r < 16) r = '0' + r.toString(16);
                                else r = r.toString(16);
                                if (g < 16) g = '0' + g.toString(16);
                                else g = g.toString(16);
                                if (b < 16) b = '0' + b.toString(16);
                                else b = b.toString(16);
                                //if (a < 16) a = '0' + r.toString(16);
                                //else a = a.toString(16);
                                //color = r + g + b + a;
                                color = r + g + b;
                                if (obj[color] > 0) ++obj[color];
                                else obj[color] = 1;
                            
                            rv.push(obj);
                            imagedata = data = obj = null;
                        
                        ctxt = null;
                     catch(error)
                        if (!rv.errors)
                            rv.errors = [];
                        
                        rv.errors.push(error);
                    
                
            );
            return rv;
        ;
     else
        $.fn.get_colors = function()
            throw new Error('canvas element support required!');
        ;
    
)(jQuery, this, this.document);

如果一个文档只有一个 4 像素 (2x2) 的图像“#ff0000, #00ff00, #0000ff, #ff0000”,如果你这样做$('img').get_colors();,它会返回["ff0000": 2, "0000ff": 1, "00ff00":1]

要了解如何使用画布元素,您可以查看MDN 和开发中的specs,了解有关像素操作的详细信息。

编辑:注释掉我在调试时使用的一行。

【讨论】:

【参考方案2】:

您可能对this related question 和my answer to another one 感兴趣。

从图像中获取所有颜色很简单,至少在支持canvas 元素的浏览器中是这样的——技术是described here。你最终会得到一个CanvasPixelArray (described here),它本质上是一个类似[r,g,b,a,r,g,b,a, ...] 的数组,其中r,g,b,a 是表示每个像素的红色、绿色、蓝色和alpha 值的字节。

困难的部分是识别或创建一小部分具有代表性的颜色,而不是 100x100 图像中可能存在的 10,000 种颜色。这是一个相当复杂的问题,有很多解决方案 (overview here)。您可以在 clusterfck library 和 my port of the Leptonica Modified Median Cut algorithm 中看到两种可能算法的 javascript 实现。

【讨论】:

这是这个问题的唯一专业答案。谢谢先生!【参考方案3】:

你在 Github 上看过这个项目吗?

http://lokeshdhakar.com/projects/color-thief/

这是一个 javascript 解决方案。 (它依赖于两个额外的库:jquery、quantize.js)。

var colorThief = new ColorThief();
colorThief.getPalette(sourceImage, 8);
getPalette(sourceImage[, colorCount, quality])

这将返回一个数组,如下所示:[ [num, num, num], [num, num, num], ... ]

【讨论】:

以上是关于是否有可以从图像生成调色板的 js 库?的主要内容,如果未能解决你的问题,请参考以下文章

如何将调色板图像从另一个线程生成到 WPF UI 线程?

为 Julia 集生成自定义调色板

如何从图像中生成突出颜色的调色板?

在 WebGL v.s. 中模拟基于调色板的图形2D画布

是否有任何自动化工具可以从 COLLADA 格式的 3d 模型生成 2d 图像以显示在网站上?

使用没有控件的 Microsoft .NET 图表控件库生成图像