📄 quantize.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 + -