public static (byte[] indexedData, uint[] palette) QuantizeImage(int[] imageData, int maxColors) { WuQuantizer quantizer = new WuQuantizer(); quantizer.BuildHistogram(imageData); quantizer.CalculateCumulativeMoments(); var boxes = quantizer.SplitData(maxColors); var palette = quantizer.BuildPalette(boxes).ToArray(); var fullPalette = new uint[256]; Array.Copy(palette, fullPalette, palette.Length); return(LookupPixels(imageData, palette), fullPalette); }
private void WriteIndexedPixels(Binary binary) { (byte[] indexedData, uint[] palette) = WuQuantizer.QuantizeImage(PixelData, 0x100); Order order = new Order(Width, Height); for (int n = 0; n < Width * Height; n++) { int x, y; (x, y) = order.GetXY(); byte b = indexedData[y * Stride + x]; binary.WriteByte(b); } for (int i = 0; i < 0x100; i++) { binary.WriteByte((byte)((palette[i] & 0xFF000000) >> 24)); binary.WriteByte((byte)((palette[i] & 0x000000FF) >> 0)); binary.WriteByte((byte)((palette[i] & 0x0000FF00) >> 8)); binary.WriteByte((byte)((palette[i] & 0x00FF0000) >> 16)); } }