首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成具有完整rgb空间的画布颜色选择器

生成具有完整rgb空间的画布颜色选择器
EN

Stack Overflow用户
提问于 2014-01-05 15:22:24
回答 2查看 6K关注 0票数 1

因为RGB需要一个立方体来显示所有的颜色,所以有更多的方法来显示所有的颜色。我希望有一个圆圈显示彩虹的所有颜色在全彩色-当点击显示所有不同的亮度,为选定的颜色,在它自己的小2D空间。

我想用画布生成类似于这个图像的东西:

我的尝试是:

Javascript:

代码语言:javascript
复制
function ColorPicker(element) {
    this.element = element;

    this.init = function() {
        var diameter = this.element.offsetWidth;

        var canvas = document.createElement('canvas');
        canvas.height = diameter;
        canvas.width = diameter,
        this.canvas = canvas;

        this.renderColorMap();

        element.appendChild(canvas);

        this.setupBindings();
    };

    this.renderColorMap = function() {
        var canvas = this.canvas;
        var ctx = canvas.getContext('2d');

        var radius = canvas.width / 2;
        var toRad = (2 * Math.PI) / 360;
        var step = 1 / radius;

        ctx.clearRect(0, 0, canvas.width, canvas.height);

        for(var i = 0; i < 360; i += step) {
            var rad = i * toRad;
            ctx.strokeStyle = 'hsl(' + i + ', 100%, 50%)';
            ctx.beginPath();
            ctx.moveTo(radius, radius);
            ctx.lineTo(radius + radius * Math.cos(rad), radius + radius * Math.sin(rad));
            ctx.stroke();
        }

        ctx.fillStyle = 'rgb(255, 255, 255)';
        ctx.beginPath();
        ctx.arc(radius, radius, radius * 0.8, 0, Math.PI * 2, true);
        ctx.closePath();
        ctx.fill();

        // render the rainbow box here ----------
    };

    this.renderMouseCircle = function(x, y) {
        var canvas = this.canvas;
        var ctx = canvas.getContext('2d');

        ctx.strokeStyle = 'rgb(255, 255, 255)';
        ctx.lineWidth = '2';
        ctx.beginPath();
        ctx.arc(x, y, 10, 0, Math.PI * 2, true);
        ctx.closePath();
        ctx.stroke();
    };

    this.setupBindings = function() {
        var canvas = this.canvas;
        var ctx = canvas.getContext('2d');
        var self = this;

        canvas.addEventListener('click', function(e) {
            var x = e.offsetX || e.clientX - this.offsetLeft;
            var y = e.offsetY || e.clientY - this.offsetTop;

            var imgData = ctx.getImageData(x, y, 1, 1).data;
            var selectedColor = new Color(imgData[0], imgData[1], imgData[2]);
            // generate this square here.

            self.renderMouseCircle(x, y);
        }, false);
    };

    this.init();
}

new ColorPicker(document.querySelector('.color-space'));

JSFiddle:http://jsfiddle.net/yH6JE/

我很难弄清楚如何在中间生成这个正方形。基本上,我希望在最左边中间的颜色与戒指上的颜色相同--这是我通过点击选择的颜色。

如何生成这种类型的梯度平方?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-05 17:50:19

它看起来像你想要一个HSL颜色直角,与色调被选择从彩色轮。

这里有一个函数,我把它放在一起画正题:

代码语言:javascript
复制
function draw(canvas, hue){
    var ctx = canvas.getContext('2d');
    for(row=0; row<100; row++){
        var grad = ctx.createLinearGradient(0, 0, 100,0);
        grad.addColorStop(0, 'hsl('+hue+', 100%, '+(100-row)+'%)');
        grad.addColorStop(1, 'hsl('+hue+', 0%, '+(100-row)+'%)');
        ctx.fillStyle=grad;
        ctx.fillRect(0, row, 100, 1);
    }   
}

希望它能做你想做的事。这里的例子:彩色长笛

票数 3
EN

Stack Overflow用户

发布于 2014-06-30 14:14:50

如果你喜欢的话,你也可以用圆圈。我认为用这种方式选择颜色比较容易。

我做了这个:https://github.com/JeroenvO/html5-colorpicker

也许你可以用它作为向导。在javascript中,我只使用了一些不透明的图像,没有使用gradi nt计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20935299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档