--- tags: Example, disqus: hackmd --- # 顏色相加 - 調色盤 因為想試試HTML API的drag跟drop,於是我想到不然來做一個A色+B色=C色好了。 [先看範例](https://codepen.io/gogorock2001/pen/JjGNMNm?editors=0011) [我的成品](https://hsiaomingcheng.github.io/react-drag-drop/public/) 因為一個顏色有RGB三色,所以顏色的相加是由兩色的RGB各自相加再除以2。 舉例:把A的R+B的R再/2,就會是C的R 首先一個顏色有RGB所以用迴圈把RGB分別取出,再把他們轉成以16位元為單位的數字,做相加再除2 ```javascript= var c1 = "#FF0000"; var c2 = "#012549"; for(var i = 0; i<3; i++) { var sub1 = c1.substring(1+2*i, 3+2*i); //取A色RGB var sub2 = c2.substring(1+2*i, 3+2*i); //取B色RGB var v1 = parseInt(sub1, 16); //把R G B轉成16位元的數字 var v2 = parseInt(sub2, 16); //把R G B轉成16位元的數字 var v = Math.floor((v1 + v2) / 2); //相加再除2 console.log('v', v); //R G B各自相加除2後的值 //R = 80, G = 12, B = 24 } ``` 再來把RGB這三個數字轉回字串,並轉為大寫,須注意要以16位元轉。 ```javascript= var c1 = "#FF0000"; var c2 = "#012549"; for(var i = 0; i<3; i++) { var sub1 = c1.substring(1+2*i, 3+2*i); var sub2 = c2.substring(1+2*i, 3+2*i); var v1 = parseInt(sub1, 16); var v2 = parseInt(sub2, 16); var v = Math.floor((v1 + v2) / 2); var sub = v.toString(16).toUpperCase(); //轉回字串,並轉為大寫 } ``` 這時候只要把,RGB三個字串加一起然後前面加個#就完成了 例: # + '80' + '12' + '24' 但是這裡有一點要注意,就是因為是16位元,有可能轉出來的字串只有一個字 ```javascript= var a = 11; a.toString(16); // 'b' ``` 這樣在最後組合RGB的時候會造成色碼不足的問題,於是要在每個字串的前面+0然後從後面取字串的2位。 ```javascript= var sub = 'b'; ('0'+sub).slice(-2); // '0b' ``` 這樣一來就大功告成。 ```javascript= var c1 = "#FF0000"; var c2 = "#012549"; var c = "#"; for(var i = 0; i<3; i++) { var sub1 = c1.substring(1+2*i, 3+2*i); var sub2 = c2.substring(1+2*i, 3+2*i); var v1 = parseInt(sub1, 16); var v2 = parseInt(sub2, 16); var v = Math.floor((v1 + v2) / 2); var sub = v.toString(16).toUpperCase(); var padsub = ('0'+sub).slice(-2); c += padsub; } document.getElementById("c1").style.backgroundColor = c1; document.getElementById("c1").innerHTML = c1; document.getElementById("c2").style.backgroundColor = c2; document.getElementById("c2").innerHTML = c2; document.getElementById("c").style.backgroundColor = c; document.getElementById("c").innerHTML = c; ``` --- 文章參考 [How can I get the color halfway between two colors?](https://stackoverflow.com/questions/14482226/how-can-i-get-the-color-halfway-between-two-colors) [Halfway between two hex color codes](https://www.programming-idioms.org/idiom/154/halfway-between-two-hex-color-codes)