将彩色十六进制混合算法与标准CMYK彩色按钮结合在一起

时间:2018-08-01 02:43:00

标签: javascript twitter-bootstrap algorithm hex

我正在尝试使用彩色按钮混合颜色的任何组合,这些按钮输出特定的十六进制数字,并与引导程序中的滑动条结合使用,该滑动条允许用户指示要使用的颜色百分比。

我无法使滑块正常运行,我不确定为什么。

我确实需要一些帮助,以将代码段组合成可以用于我的美术课的有效算法。完整的代码可以在这里找到:

https://jsfiddle.net/mw7optL5/289/

//Hex blending algorithm
var mix = function(color_1, color_2, weight) {
  function d2h(d) { return d.toString(16); }  // convert a decimal value to hex
  function h2d(h) { return parseInt(h, 16); } // convert a hex value to decimal 

  weight = (typeof(weight) !== 'undefined') ? weight : 50; // set the weight to 50%, if that argument is omitted

  var color = "#";

  for(var i = 0; i <= 5; i += 2) { // loop through each of the 3 hex pairs—red, green, and blue
    var v1 = h2d(color_1.substr(i, 2)), // extract the current pairs
        v2 = h2d(color_2.substr(i, 2)),

        // combine the current pairs from each source color, according to the specified weight
        val = d2h(Math.floor(v2 + (v1 - v2) * (weight / 100.0))); 

    while(val.length < 2) { val = '0' + val; } // prepend a '0' if val results in a single digit

    color += val; // concatenate val to our new color string
  }

  return color; // PROFIT!
  };

//buttons
 <button class="Yellow" onclick="mix('#ffff00')">Yellow</button>
 <button class="Magenta" onclick="mix('#D9017A')">Magenta</button>
 <button class="Cyan" onclick="mix('#009FDF')">Cyan</button>
 <button class="Black" onclick="mix('#2D2926')">Black</button>
 <button class="Orange021" onclick="mix('#FE5000')">Orange</button>

//slider bar
<input id="ex1" data-slider-id='ex1Slider' type="text" data-slider-min="0" data-slider-max="20" data-slider-step="1" data-slider-value="14"/>

var slider = new Slider('#ex1', {
    formatter: function(value) {
        return 'Current value: ' + value;
    }
});

1 个答案:

答案 0 :(得分:3)

这只是解决了我认为想要的机制(正确运行并保存滑块值),并且可以用作起点。这并不能解决您想要的任何颜色组合的公式。

  • 使用所有百分比(默认为0)(如{ Yellow: 0, Magenta: 0, Cyan: 0, Black: 0 }
  • )在按钮中创建对象
  • 为每个按钮.click(jquery)或.addEventListener(纯js)添加事件监听器
  • 在每个按钮的回调中,将颜色和百分比保存到对象中,例如colorPercentages[colors[i].getAttribute("id")] = $("#ex1").val();,其中$("#ex1").val()是滑块的值。
  • 根据某些公式绘制颜色,例如$("body").css('background-color', 'rgb(' + r + ', ' + g + ', ' + b + ')');

在这种情况下,我使用了以下公式:

红色= 255 x(1-青色/ 100)x(1-黑色/ 100)

绿色= 255 x(1-洋红色/ 100)x(1-黑色/ 100)

蓝色= 255 x(1-黄色/ 100)x(1-黑色/ 100)

以下是基于@barbsan修改的完整功能示例:https://jsfiddle.net/5dsgbne9/

该示例使用了颜色按钮单击事件,但是您也可以使用逆逻辑,当用户使用以下方式移动滑块时更改颜色:

$("#ex1").slider().on('slideStop', function(ev){
    //code
});

据我了解,很难实现混合算法,此问题和答案提供了一些好的方法:Mixing two colors "naturally" in javascript,但是您仍然需要混合n种颜色,而不仅仅是2种,这更加复杂。幸运的是,这似乎并非不可能。