packRgb function
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;
}