⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quantize.h

📁 实现八叉树
💻 H
字号:
#ifndef _QUANTIZE_H
#define _QUANTIZE_H

#include <vector>
using namespace std;

#define SAFE_DELETE(x) if(x){ delete x; x=0;}

struct SOctant
{
	SOctant		*m_pParent;
	SOctant		*m_pChildren[8];
	int			m_iRefCount;
	int			m_iRed;
	int			m_iGreen;
	int			m_iBlue;
	int			m_iPalIndex;
	SOctant()
	{
		memset( this, 0, sizeof( SOctant ));
	}
	~SOctant()
	{
		for( int i=0; i<8; i++ )
			SAFE_DELETE( m_pChildren[i] );
		m_pParent = 0;
	}
	BOOL		IsLeaf()
	{
		SOctant *pChildren[8]={0};
		if( !memcmp(pChildren, m_pChildren, sizeof(pChildren) ) )
			return true;
		else return false;
	}
	BOOL		IsRev2ndLevel();
	void		SumChildren()
	{
		for(int i=0;i<8;i++)
			if( m_pChildren[i] )
			{
				m_iRefCount += m_pChildren[i]->m_iRefCount;
				m_iRed += m_pChildren[i]->m_iRed;
				m_iGreen += m_pChildren[i]->m_iGreen;
				m_iBlue += m_pChildren[i]->m_iBlue;
			}
	}
};

class OctreeQuantize
{
public:
	SOctant		*m_pOctantRoot;
	WORD		*m_pPal;
	BYTE		*m_pbyIndexedImg;
protected:
	int			m_iPalIndex;
	int			m_iNumColors;
	vector<SOctant*> m_vRev2ndLevelOctants;

public:
	void Chg16bitTo256( WORD *pwImgBuf, int width, int height, int pitch );
	void MapImgTo256( WORD *pwImgBuf, int width, int height, int  pitch );
	OctreeQuantize();
	~OctreeQuantize();
protected:
	void BuildPal();
	void BuildPalIt(SOctant *pOctant );
	void GetDescendant( SOctant *pCurOctant, BOOL bTranverseChild = true );
	void ReduceTo256();
	void BuildOctree( WORD *pwImgBuf, int width, int height, int pitch );
	void BuildRev2ndLevelVector(SOctant *pOctant);
};


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -