Home > Web Front-end > JS Tutorial > How can I programmatically lighten or darken a HEX color, handle RGB colors, and blend colors together?

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

Mary-Kate Olsen
Release: 2024-11-05 07:15:02
Original
398 people have browsed it

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

Programmatically Lighten or Darken a HEX color (or RGB, and blend colors)

The Problem

The goal is to create a function that can lighten or darken a hex color by a specific amount. Additionally, you want to handle RGB colors and blend colors together.

The Solution

<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));
Copy after login

Explanation

This function works by converting the hex color to an integer, adding or subtracting the specified amount to each of the RGB channels, and then converting the result back to a hex color.

Enhancements

To enhance the function, you can add error handling and support for different color formats (RGB, HSL). You can also add the ability to blend colors together by passing in a second color parameter.

Here's an Improved Version:

<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>
Copy after login

This improved version includes the following features:

  • Error handling: The function checks for invalid input and returns null if the input is invalid.
  • Support for different color formats: The function supports hex, RGB, and RGBA color formats.
  • Color blending: You can blend two colors together by passing in a second color parameter.
  • Linear or logarithmic blending: You can specify whether to use linear or logarithmic blending by passing in a fourth parameter.
  • Alpha channel support: The function supports alpha channels, and you can blend alpha channels together when blending colors.

The above is the detailed content of How can I programmatically lighten or darken a HEX color, handle RGB colors, and blend colors together?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template