static public byte[] OctreeQuantization(byte[] buffer) { byte[] result = new byte[buffer.Length]; OctreeQuantizer octree = new OctreeQuantizer(); for (int i = 0; i < buffer.Length; i += 4) { octree.AddColor(Color.FromArgb(buffer[i + 2], buffer[i + 1], buffer[i])); } var limitedPalette = octree.GetPalette(Constants.filterOctreeColorLimit); for (int i = 0; i < buffer.Length; i += 4) { Color currentPixel = Color.FromArgb(buffer[i + 2], buffer[i + 1], buffer[i]); Color resultPixel = limitedPalette[octree.GetPaletteIndex(currentPixel)]; result[i + 0] = resultPixel.B; result[i + 1] = resultPixel.G; result[i + 2] = resultPixel.R; result[i + 3] = 255; } return(result); }
public OctreeNode(int level, OctreeQuantizer parent) //level - level of parent { nodes = new OctreeNode[8]; if (level < 7) { parent.AddLevelNode(level, this); } }