packRgb function

Uint8List packRgb(
  1. List<int> pixels,
  2. int pixelCount, {
  3. bool invert = false,
  4. int bitsStored = 8,
})

Packs 8-bit or 16-bit RGB pixels (triplets R, G, B, R, G, B...) into an RGBA Uint8List.

Each pixel maps 3 source channels (R, G, B) to 4 output bytes (R, G, B, A=255). If invert is true, inverts RGB values (255 - channel). pixelCount caps the number of pixels processed.

Implementation

Uint8List packRgb(
  final List<int> pixels,
  final int pixelCount, {
  final bool invert = false,
  final int bitsStored = 8,
}) {
  final rgbaData = Uint8List(pixelCount * 4);
  final maxPixels =
      pixelCount < (pixels.length ~/ 3) ? pixelCount : (pixels.length ~/ 3);
  final shift = bitsStored > 8 ? bitsStored - 8 : 0;
  for (var i = 0; i < maxPixels; i++) {
    final src = i * 3;
    final dst = i * 4;
    var r = (pixels[src + 0] >> shift).clamp(0, 255);
    var g = (pixels[src + 1] >> shift).clamp(0, 255);
    var b = (pixels[src + 2] >> shift).clamp(0, 255);
    if (invert) {
      r = 255 - r;
      g = 255 - g;
      b = 255 - b;
    }
    rgbaData[dst + 0] = r;
    rgbaData[dst + 1] = g;
    rgbaData[dst + 2] = b;
    rgbaData[dst + 3] = 255;
  }
  return rgbaData;
}