rgbaToLab static method

Lab rgbaToLab({
  1. required int r,
  2. required int g,
  3. required int b,
  4. int a = 255,
  5. Rgba? bg,
})

Implementation

static Lab rgbaToLab({
  required int r,
  required int g,
  required int b,
  int a = 255,
  Rgba? bg,
}) {
  bg ??= kDefaultBgColor;

  // RGBA -> RGB
  final double pAlpha = (a) / 255;
  double pR = r.toDouble();
  double pG = g.toDouble();
  double pB = b.toDouble();

  pR = (1 - pAlpha) * bg.r + pR * pAlpha;
  pG = (1 - pAlpha) * bg.g + pG * pAlpha;
  pB = (1 - pAlpha) * bg.b + pB * pAlpha;

  // normalize colors
  pR = pR / 255.0;
  pG = pG / 255.0;
  pB = pB / 255.0;

  // convert to xyz
  pR = _normalizeColor(pR);
  pG = _normalizeColor(pG);
  pB = _normalizeColor(pB);

  double x = (pR * 0.4124 + pG * 0.3576 + pB * 0.1805) * 100;
  double y = (pR * 0.2126 + pG * 0.7152 + pB * 0.0722) * 100;
  double z = (pR * 0.0193 + pG * 0.1192 + pB * 0.9505) * 100;

  // convert to lab
  x = (x / 95.047);
  y = (y / 100.0);
  z = (z / 108.883);

  x = _normalizeXYZ(x);
  y = _normalizeXYZ(y);
  z = _normalizeXYZ(z);

  return Lab(
    double.parse(((116.0 * y) - 16.0).toStringAsFixed(3)),
    double.parse((500.0 * (x - y)).toStringAsFixed(3)),
    double.parse((200.0 * (y - z)).toStringAsFixed(3)),
  );
}