首頁 >web前端 >js教程 >如何以程式設計方式調亮或調暗十六進位顏色、處理 RGB 顏色以及將顏色混合在一起?

如何以程式設計方式調亮或調暗十六進位顏色、處理 RGB 顏色以及將顏色混合在一起?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-05 07:15:02398瀏覽

How can I programmatically lighten or darken a HEX color, handle RGB colors, and blend colors together?

以編程方式使十六進制顏色(或RGB 和混合顏色)變亮或變暗

問題

目標是創建一個函數,可以將十六進位顏色變亮或變暗特定量。此外,您想要處理 RGB 顏色並將顏色混合在一起。

<code class="javascript">function LightenDarkenColor(col, amt) {
  col = parseInt(col, 16);
  return (((col &amp; 0x0000FF) + amt) | ((((col >> 8) &amp; 0x00FF) + amt) << 8) | (((col >> 16) + amt) << 16)).toString(16);
}

// TEST
console.log(LightenDarkenColor("3F6D2A", 40));

說明

此函數的工作原理是將十六進位顏色轉換為整數,然後添加或減去每個RGB 通道的指定數量,然後將結果轉換回十六進位顏色。

增強

要增強功能,您可以添加錯誤處理和對不同顏色的支援顏色格式(RGB、HSL)。您也可以透過傳入第二個顏色參數來新增將顏色混合在一起的功能。

這是改進版本:

<code class="javascript">function pSBC(p, c0, c1, l) {
  let r, g, b, P, f, t, h, i = parseInt;
  if (typeof(p) != "number" || p <-1 || p > 1 || typeof(c0) != "string" || (c0[0] != 'r' &amp;&amp; c0[0] != '#') || (c1 &amp;&amp; !a)) return null;
  if (!this.pSBCr) this.pSBCr = (d) => {
    let n = d.length, x = {};
    if (n > 9) {
      [r, g, b, a] = d = d.split(",");
      n = d.length;
      if (n < 3 || n > 4) return null;
      x.r = i(r[3] == "a" ? r.slice(5): r.slice(4), 16);
      x.g = i(g);
      x.b = i(b);
      x.a = a ? parseFloat(a) : -1;
    } else {
      if (n == 8 || n == 6 || n < 4) return null;
      if (n < 6) d = "#" + d[1] + d[1] + d[2] + d[2] + d[3] + d[3] + (n > 4 ? d[4] + d[4] : "");
      d = i(d.slice(1), 16);
      if (n == 9 || n == 5) x.r = d >> 24 &amp; 255, x.g = d >> 16 &amp; 255, x.b = d >> 8 &amp; 255, x.a = m((d &amp; 255) / 0.255) /1000;
      else x.r = d >> 16, x.g = d >> 8 &amp; 255, x.b = d &amp; 255, x.a = -1;
    }
    return x;
  };

  h = c0.length > 9;
  h = a ? c1.length > 9 ? true : c1 == "c"?!h : false : h;
  f = this.pSBCr(c0);
  P = p < 0;
  t = c1 &amp;&amp; c1 != "c" ? this.pSBCr(c1) : P ? {r:0,g:0,b:0,a:-1} : {r:255,g:255,b:255,a:-1};
  p = P ? p*-1 : p;
  P = 1-p;
  if (!f || !t) return null;
  if (l) r = m(P*f.r + p*t.r), g = m(P*f.g + p*t.g), b = m(P*f.b + p*t.b);
  else r = m((P*f.r**2 + p*t.r**2)**0.5), g = m((P*f.g**2 + p*t.g**2)**0.5), b = m((P*f.b**2 + p*t.b**2)**0.5);
  a = f.a, t = t.a, f= a >= 0 || t >= 0, a = f ? a < 0 ? t : t < 0 ? a : a*P + t*p : 0;
  if (h) return "rgb" + (f ? "a(" : "(") +r + "," +g + "," +b + (f ? "," + m(a*1000)/1000 : "") + ")";
  else return "#" + (4294967296+r*16777216+g*65536+b*256+(f ? m(a*255):0)).toString(16).slice(1, (f? undefined : -2));
}</code>

此改進版本包括以下功能:

  • 錯誤處理:函數檢查無效輸入,如果輸入無效則傳回null。
  • 支援不同的顏色格式:函數支援十六進位、RGB 和 RGBA 顏色格式。
  • 顏色混合:您可以透過傳入第二個顏色參數將兩種顏色混合在一起。
  • 線性或對數Blending:可以透過傳入第四個參數來指定是使用線性還是對數混合。
  • Alpha通道支援:函數支援Alpha通道,可以混合Alpha通道混合顏色時一起。

以上是如何以程式設計方式調亮或調暗十六進位顏色、處理 RGB 顏色以及將顏色混合在一起?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn