首页 > web前端 > js教程 > pSBC 函数如何进行着色、混合和颜色转换?

pSBC 函数如何进行着色、混合和颜色转换?

Patricia Arquette
发布: 2024-11-05 10:35:02
原创
1054 人浏览过

How Does the pSBC Function Work for Shading, Blending, and Color Conversion?

此函数 pSBC 采用 HEX 或 RGB 网页颜色并对其执行操作,例如着色、混合或格式之间的转换。它的工作原理如下:

阴影: pSBC 可以按指定的百分比使颜色变亮或变暗。与更大且更慢的基于 HSL 的函数不同,它无需转换为 HSL 即可实现此目的。因此,pSBC 的结果可能与 HSL 函数的结果不同。

混合: pSBC 可以使用线性或对数混合将两种颜色混合在一起。通过指定混合百分比,可以在两种颜色之间创建平滑过渡。支持 Alpha 通道,允许透明混合。

转换: 在混合颜色或执行着色时,pSBC 自动将 HEX 转换为 RGB 或将 RGB 转换为 HEX。它还处理 3 位十六进制代码(例如“#C41”)并将其扩展为标准 6 位十六进制代码。

功能:

  • 自动检测和接受标准 HEX 和 RGB 颜色格式。
  • 按百分比将颜色着色为白色或黑色。
  • 按百分比将颜色混合在一起。
  • HEX 和 RGB 之间的转换,单独或混合期间。
  • 将 3 位十六进制代码扩展为标准 6 位代码。
  • 处理 Alpha 通道以进行透明颜色的线性混合。

用法:

要使用 pSBC,您可以向其传递三个参数:

  • p:着色或混合的百分比(从 -1 到1).
  • c0:第一种颜色,作为十六进制或 RGB 字符串。
  • c1:用于混合或着色的第二种颜色。如果省略,则使用 c 进行着色,使用 "c" 进行转换。

例如 pSBC(0.5, "rgb(20,60,200)", "rgba(200,60,20,0.67423) )") 会将两种颜色混合 50%。

代码:

pSBC 的代码如下:

<code class="js">const pSBC = (p, c0, c1, l = false) => {
  let r, g, b, P, f, t, h, i = parseInt;
  if (typeof p != "number" || p < -1 || p > 1 || typeof c0 != "string" || (c0[0] != "r" && c0[0] != "#") || (c1 && !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)), 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 & 255, x.g = d >> 16 & 255, x.b = d >> 8 & 255, x.a = m((d & 255) / 0.255) / 1000;
      else x.r = d >> 16, x.g = d >> 8 & 255, x.b = d & 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 && 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)
};
登录后复制

微函数:

如果速度和大小是您的首要任务,您可以使用下面的两线 RGB 函数。这些函数牺牲了一些功能,例如错误检查、十六进制转换和 Alpha 通道支持。它们速度快得令人难以置信,而且很小:

<code class="js">const RGB_Linear_Blend = (p, c0, c1) => {
  var i = parseInt, r = Math.round, P = 1 - p, [a, b, c, d] = c0.split(","), [e, f, g, h] = c1.split(","), x = d || h, j = x ? "," + (!d ? h : !h ? d : r((parseFloat(d) * P + parseFloat(h) * p) * 1000) / 1000 + ")") : ")";
  return "rgb" + (x ? "a(" : "(") + r(i(a[3] == "a" ? a.slice(5) : a.slice(4)) * P + i(e[3] == "a" ? e.slice(5) : e.slice(4)) * p) + "," + r(i(b) * P + i(f) * p) + "," + r(i(c) * P + i(g) * p) + j;
};

const RGB_Linear_Shade = (p, c) => {
  var i = parseInt, r = Math.round, [a, b, c, d] = c.split(","), P = p < 0, t = P ? 0 : 255 * p, P = P ? 1 + p : 1 - p;
  return "rgb" + (d ? "a(" : "(") + r(i(a[3] == "a" ? a.slice(5) : a.slice(4)) * P + t) + "," + r(i(b) * P + t) + "," + r(i(c) * P + t) + (d ? "," + d : ")");
};

const RGB_Log_Blend = (p, c0, c1) => {
  var i = parseInt, r = Math.round, P = 1 - p, [a, b, c, d] = c0.split(","), [e, f, g, h] = c1.split(","), x = d || h, j = x ? "," + (!d ? h : !h ? d : r((parseFloat(d) * P + parseFloat(h) * p) * 1000) / 1000 + ")") : ")";</code>
登录后复制

以上是pSBC 函数如何进行着色、混合和颜色转换?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板