public static unsafe void CalculateOctreeColorQuantization(byte *pBuffer, WriteableBitmap bitmap, params object[] otherParams) { int width = bitmap.PixelWidth; int height = bitmap.PixelHeight; int maxColors = (int)otherParams[0]; OctreeColorQuantizer octreeColorQuantizer = new OctreeColorQuantizer(maxColors); for (int y = 0; y < height; y++) // Prepare quantization { for (int x = 0; x < width; x++) { octreeColorQuantizer.AddPixelColor(pBuffer[4 * x + (y * bitmap.BackBufferStride) + 0], pBuffer[4 * x + (y * bitmap.BackBufferStride) + 1], pBuffer[4 * x + (y * bitmap.BackBufferStride) + 2]); } } octreeColorQuantizer.FinalizePalette(); for (int y = 0; y < height; y++) // Write new pixel values from generated palette { for (int x = 0; x < width; x++) { (int b, int g, int r)newColor = octreeColorQuantizer.GetNearestPaletteColor(pBuffer[4 * x + (y * bitmap.BackBufferStride) + 0], pBuffer[4 * x + (y * bitmap.BackBufferStride) + 1], pBuffer[4 * x + (y * bitmap.BackBufferStride) + 2]); pBuffer[4 * x + (y * bitmap.BackBufferStride) + 0] = (byte)newColor.b; pBuffer[4 * x + (y * bitmap.BackBufferStride) + 1] = (byte)newColor.g; pBuffer[4 * x + (y * bitmap.BackBufferStride) + 2] = (byte)newColor.r; } } }
public OctreeNode(OctreeNode parentNode, int treeLevel, OctreeColorQuantizer octreeColorQuantizer) { this.parentNode = parentNode; this.treeLevel = treeLevel; this.octreeColorQuantizer = octreeColorQuantizer; children = new OctreeNode[8]; octreeColorQuantizer.leafCount++; octreeColorQuantizer.treeLevels[treeLevel].Add(this); // Register this node in list of nodes for each level in octreeColorQuantizer }