//============================================================ // <T>构造OCTree颜色优化器。</T> //============================================================ public FOctreeQuantizer() { for (int n = 0; n < 7; n++) { _levels[n] = new FOctreeNodes(); } _root = new FOctreeNode(this, 0); }
//============================================================ // <T>获得使用节点集合。</T> //============================================================ public void FilterLeaf(FOctreeNodes leafs) { if (_pixelCount > 0) { leafs.Push(this); } for (int index = 0; index < 8; index++) { FOctreeNode node = _nodes[index]; if (null != node) { node.FilterLeaf(leafs); } } }
//============================================================ // <T>生成指定颜色数目的调色板。</T> // // @param count 颜色数目 // @return 颜色列表; //============================================================ public List <Color> MakePalette(int count) { // 获得所有节点 int leafCount = _root.LeafCount(); // 合并节点叶子 for (int level = 6; level >= 0; level--) { FOctreeNodes nodes = _levels[level]; if (!nodes.IsEmpty) { nodes.Sort(new FOctreeNodeSorter()); foreach (FOctreeNode node in nodes) { leafCount -= node.RemoveLeaves(); if (leafCount <= count) { break; } } if (leafCount <= count) { break; } } nodes.Clear(); } if (leafCount > count) { throw new FFatalException("Make palette failure. (count={0})", leafCount); } // 增加颜色列表 int paletteIndex = 0; List <Color> result = new List <Color>(); FilterLeaf(_leafs); foreach (FOctreeNode node in _leafs) { result.Add(node.Color); node.SetPaletteIndex(paletteIndex++); } // 检查结果 return(result); }
//============================================================ // <T>获得所有有效节点。</T> //============================================================ public void FilterLeaf(FOctreeNodes leafs) { leafs.Clear(); _root.FilterLeaf(leafs); }