亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? quantize.cpp

?? 一個octree algorithm 的實現CQuantizer.
?? CPP
字號:
#include <windows.h>
#include "Quantize.h"
/////////////////////////////////////////////////////////////////////////////
CQuantizer::CQuantizer (UINT nMaxColors, UINT nColorBits)
{
	m_nColorBits = nColorBits < 8 ? nColorBits : 8;

	m_pTree	= NULL;
	m_nLeafCount = 0;
	for	(int i=0; i<=(int) m_nColorBits; i++)
		m_pReducibleNodes[i] = NULL;
	m_nMaxColors = nMaxColors;
}
/////////////////////////////////////////////////////////////////////////////
CQuantizer::~CQuantizer	()
{
	if (m_pTree	!= NULL)
		DeleteTree (&m_pTree);
}
/////////////////////////////////////////////////////////////////////////////
BOOL CQuantizer::ProcessImage (HANDLE hImage)
{
	BYTE r,	g, b;
	int	i, j;

	BITMAPINFOHEADER ds;
	memcpy(&ds,hImage, sizeof(ds));
	int effwdt = ((((ds.biBitCount * ds.biWidth ) + 31) / 32) * 4);

	int	nPad = effwdt - (((ds.biWidth *	ds.biBitCount) + 7) / 8);

	BYTE* pbBits = (BYTE*)hImage + *(LPDWORD)hImage;

	switch (ds.biBitCount) {

	case 1:	// 1-bit DIB
	case 4:	// 4-bit DIB
	case 8:	// 8-bit DIB
		for	(i=0; i<ds.biHeight;	i++) {
			for	(j=0; j<ds.biWidth; j++)	{
				BYTE idx=GetPixelIndex(j,i,ds.biBitCount,effwdt,pbBits);
				BYTE* pal = (BYTE*)(hImage) + sizeof(BITMAPINFOHEADER);
				long ldx = idx*sizeof(RGBQUAD);
				b = pal[ldx++];
				g = pal[ldx++];
				r = pal[ldx];
				AddColor (&m_pTree,	r, g, b, m_nColorBits, 0, &m_nLeafCount,
					m_pReducibleNodes);
				while (m_nLeafCount	> m_nMaxColors)
					ReduceTree (m_nColorBits, &m_nLeafCount,
						m_pReducibleNodes);
			}
		}

		break;
	case 24: //	24-bit DIB
		for	(i=0; i<ds.biHeight;	i++) {
			for	(j=0; j<ds.biWidth; j++)	{
				b =	*pbBits++;
				g =	*pbBits++;
				r =	*pbBits++;
				AddColor (&m_pTree,	r, g, b, m_nColorBits, 0, &m_nLeafCount,
					m_pReducibleNodes);
				while (m_nLeafCount	> m_nMaxColors)
					ReduceTree (m_nColorBits, &m_nLeafCount, m_pReducibleNodes);
			}
			pbBits += nPad;
		}
		break;

	default: //	Unrecognized color format
		return FALSE;
	}
	return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
void CQuantizer::AddColor (NODE** ppNode, BYTE r, BYTE g, BYTE b,
	UINT nColorBits, UINT nLevel, UINT*	pLeafCount,	NODE** pReducibleNodes)
{
	static BYTE	mask[8]	= {	0x80, 0x40,	0x20, 0x10,	0x08, 0x04,	0x02, 0x01 };

	// If the node doesn't exist, create it.
	if (*ppNode	== NULL)
		*ppNode	= (NODE*)CreateNode (nLevel, nColorBits, pLeafCount, pReducibleNodes);

	// Update color	information	if it's	a leaf node.
	if ((*ppNode)->bIsLeaf)	{
		(*ppNode)->nPixelCount++;
		(*ppNode)->nRedSum += r;
		(*ppNode)->nGreenSum +=	g;
		(*ppNode)->nBlueSum	+= b;
	} else {	// Recurse a level deeper if the node is not a leaf.
		int	shift =	7 -	nLevel;
		int	nIndex =(((r & mask[nLevel]) >> shift) << 2) |
					(((g & mask[nLevel]) >>	shift) << 1) |
					(( b & mask[nLevel]) >> shift);
		AddColor (&((*ppNode)->pChild[nIndex]),	r, g, b, nColorBits,
					nLevel + 1,	pLeafCount,	pReducibleNodes);
	}
}
/////////////////////////////////////////////////////////////////////////////
void* CQuantizer::CreateNode (UINT nLevel, UINT	nColorBits,	UINT* pLeafCount,
	NODE** pReducibleNodes)
{
	NODE* pNode = (NODE*)calloc(1,sizeof(NODE));

	if (pNode== NULL) return NULL;

	pNode->bIsLeaf = (nLevel ==	nColorBits)	? TRUE : FALSE;
	if (pNode->bIsLeaf) (*pLeafCount)++;
	else {
		pNode->pNext = pReducibleNodes[nLevel];
		pReducibleNodes[nLevel]	= pNode;
	}
	return pNode;
}
/////////////////////////////////////////////////////////////////////////////
void CQuantizer::ReduceTree	(UINT nColorBits, UINT*	pLeafCount,
	NODE** pReducibleNodes)
{
	// Find	the	deepest	level containing at	least one reducible	node.
	for	(int i=nColorBits -	1; (i>0) &&	(pReducibleNodes[i]	== NULL); i--);

	// Reduce the node most	recently added to the list at level	i.
	NODE* pNode	= pReducibleNodes[i];
	pReducibleNodes[i] = pNode->pNext;

	UINT nRedSum = 0;
	UINT nGreenSum = 0;
	UINT nBlueSum =	0;
	UINT nChildren = 0;

	for	(i=0; i<8; i++)	{
		if (pNode->pChild[i] !=	NULL) {
			nRedSum	+= pNode->pChild[i]->nRedSum;
			nGreenSum += pNode->pChild[i]->nGreenSum;
			nBlueSum +=	pNode->pChild[i]->nBlueSum;
			pNode->nPixelCount += pNode->pChild[i]->nPixelCount;
			free(pNode->pChild[i]);
			pNode->pChild[i] = NULL;
			nChildren++;
		}
	}

	pNode->bIsLeaf = TRUE;
	pNode->nRedSum = nRedSum;
	pNode->nGreenSum = nGreenSum;
	pNode->nBlueSum	= nBlueSum;
	*pLeafCount	-= (nChildren -	1);
}
/////////////////////////////////////////////////////////////////////////////
void CQuantizer::DeleteTree	(NODE**	ppNode)
{
	for	(int i=0; i<8; i++)	{
		if ((*ppNode)->pChild[i] !=	NULL) DeleteTree (&((*ppNode)->pChild[i]));
	}
	free(*ppNode);
	*ppNode	= NULL;
}
/////////////////////////////////////////////////////////////////////////////
void CQuantizer::GetPaletteColors (NODE* pTree,	RGBQUAD* prgb, UINT* pIndex)
{
	if (pTree){
		if (pTree->bIsLeaf)	{
			prgb[*pIndex].rgbRed = (BYTE)((pTree->nRedSum)/(pTree->nPixelCount));
			prgb[*pIndex].rgbGreen = (BYTE)((pTree->nGreenSum)/(pTree->nPixelCount));
			prgb[*pIndex].rgbBlue = (BYTE)((pTree->nBlueSum)/(pTree->nPixelCount));
			prgb[*pIndex].rgbReserved =	0;
			(*pIndex)++;
		} else {
			for	(int i=0; i<8; i++)	{
				if (pTree->pChild[i] !=	NULL)
					GetPaletteColors (pTree->pChild[i],	prgb, pIndex);
			}
		}
	}
}
/////////////////////////////////////////////////////////////////////////////
UINT CQuantizer::GetColorCount ()
{
	return m_nLeafCount;
}
/////////////////////////////////////////////////////////////////////////////
void CQuantizer::SetColorTable (RGBQUAD* prgb)
{
	UINT nIndex	= 0;
	GetPaletteColors (m_pTree, prgb, &nIndex);
}
/////////////////////////////////////////////////////////////////////////////
BYTE CQuantizer::GetPixelIndex(long x, long y, int nbit, long effwdt, BYTE *pimage)
{
	if (nbit==8){
		return pimage[y*effwdt + x];
	} else {
		BYTE pos;
		BYTE iDst= pimage[y*effwdt + (x*nbit >> 3)];
		if (nbit==4){
			pos = 4*(1-x%2);
			iDst &= (0x0F<<pos);
			return iDst >> pos;
		} else if (nbit==1){
			pos = 7-x%8;
			iDst &= (0x01<<pos);
			return iDst >> pos;
		}
	}
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区美女| 国产盗摄精品一区二区三区在线| 欧美中文字幕一区二区三区| 色屁屁一区二区| 国产偷国产偷精品高清尤物| 精品亚洲成av人在线观看| 在线电影一区二区三区| 伊人色综合久久天天人手人婷| 国产成人亚洲综合a∨婷婷| 日韩免费性生活视频播放| 久久不见久久见免费视频1| 日韩欧美国产一二三区| 国产成人自拍在线| 亚洲免费在线看| 日韩免费在线观看| 国产精品系列在线播放| 国产精品免费视频观看| 国产大陆精品国产| 日韩一区二区三区电影在线观看 | 久久久www免费人成精品| 五月天欧美精品| 成人性视频网站| 久久老女人爱爱| 亚洲高清一区二区三区| 欧美日韩视频第一区| 国产拍欧美日韩视频二区| 日韩精品电影在线| 欧美一区二区福利在线| 亚洲主播在线观看| 成人一区二区视频| 国产麻豆日韩欧美久久| 日韩精品电影一区亚洲| 一区二区三区 在线观看视频 | 丁香激情综合国产| 免费欧美高清视频| 黄色日韩网站视频| 久久av老司机精品网站导航| 精品在线视频一区| 国产精品一区二区三区99| 麻豆成人av在线| 国产在线精品不卡| 成人免费三级在线| 91色|porny| 欧美精品 日韩| 欧美白人最猛性xxxxx69交| 日韩欧美专区在线| 国产欧美久久久精品影院| 欧美一区二区精品在线| 欧美国产在线观看| 一区二区三区久久| 五月激情丁香一区二区三区| 精品一区二区免费看| 成人手机在线视频| 欧美一级片免费看| 欧美猛男男办公室激情| 国产成人日日夜夜| 亚洲观看高清完整版在线观看| 自拍偷拍欧美激情| 日韩av电影天堂| 色av成人天堂桃色av| 日韩电影在线一区二区三区| 国产精品久久三区| 欧美顶级少妇做爰| 99综合电影在线视频| 亚洲男女一区二区三区| 国产精品人人做人人爽人人添| 亚洲电影第三页| 成人国产在线观看| 日韩三级在线免费观看| 99国产精品久久久| 欧美精品一区二区三区在线 | 蜜臀av一级做a爰片久久| 国产一区二区中文字幕| 91色婷婷久久久久合中文| 91精品国产综合久久久久久漫画 | 成人午夜在线免费| 欧美男男青年gay1069videost| 国产精品婷婷午夜在线观看| 国产在线精品视频| 欧美大片日本大片免费观看| 日韩电影一区二区三区四区| 欧美视频在线一区二区三区| 亚洲色欲色欲www| www.亚洲在线| 亚洲国产高清在线观看视频| 国产成人免费av在线| 国产日韩v精品一区二区| 高清不卡一区二区在线| 国产欧美日韩在线看| 国产高清亚洲一区| 欧美人妇做爰xxxⅹ性高电影| 韩国精品久久久| 久久久久久一级片| 色综合久久精品| 琪琪一区二区三区| 97久久精品人人澡人人爽| 国产凹凸在线观看一区二区| 亚洲欧美国产77777| 亚洲视频图片小说| 日韩精品一级中文字幕精品视频免费观看| 在线不卡欧美精品一区二区三区| 伊人色综合久久天天人手人婷| 99久久国产综合色|国产精品| 国产目拍亚洲精品99久久精品| 精品一二三四区| 亚洲欧洲av一区二区三区久久| 国内精品不卡在线| 精品成人免费观看| 国产乱子伦一区二区三区国色天香| 日韩欧美一区二区视频| 久久综合国产精品| 99久久综合国产精品| 亚洲视频在线观看一区| 欧美日韩在线亚洲一区蜜芽| 麻豆成人av在线| 亚洲宅男天堂在线观看无病毒| 精品国产乱码久久久久久牛牛| 粉嫩aⅴ一区二区三区四区| 一区二区三区丝袜| 91精品综合久久久久久| 成人av午夜影院| 国产一区视频网站| 亚洲成av人片在www色猫咪| 精品女同一区二区| 欧美蜜桃一区二区三区| av色综合久久天堂av综合| 国产一区在线精品| 日韩中文字幕区一区有砖一区 | 在线看国产一区二区| 六月丁香婷婷色狠狠久久| 亚洲女同一区二区| 国产亚洲福利社区一区| 欧美www视频| 91精品国产一区二区三区香蕉 | 日韩成人一级大片| 一级日本不卡的影视| 丝袜国产日韩另类美女| 中文字幕在线观看一区| 亚洲国产高清aⅴ视频| 日韩一区二区三区四区五区六区| 国产美女精品一区二区三区| 日韩国产精品91| 视频在线在亚洲| 99视频精品在线| 国产精品高潮呻吟| 蜜桃精品视频在线观看| www.成人网.com| 国产一区二区三区最好精华液| 国产欧美一二三区| 在线观看国产91| 精品一区在线看| 亚洲欧美视频一区| 日韩欧美中文一区| 91色婷婷久久久久合中文| 蜜臀av一区二区在线观看| 国产精品的网站| 国产欧美一区二区在线观看| 久久久欧美精品sm网站| 一色桃子久久精品亚洲| 亚洲一区二区三区四区在线观看 | 亚洲欧洲av一区二区三区久久| 精品国产伦一区二区三区免费 | 国产成人精品影视| 成人午夜视频免费看| 在线免费观看日本一区| 欧美日韩在线播放一区| 欧美一区二区三区性视频| 国产午夜久久久久| 亚洲国产中文字幕在线视频综合 | 国内精品写真在线观看| 国产精品资源站在线| 色噜噜狠狠成人网p站| 91麻豆精品国产综合久久久久久| 精品国产百合女同互慰| 最新国产の精品合集bt伙计| 蜜桃传媒麻豆第一区在线观看| 国产高清久久久久| 7777女厕盗摄久久久| 国产精品盗摄一区二区三区| 日韩精品视频网| 色婷婷综合久久久中文字幕| 一本一道波多野结衣一区二区| 欧美国产精品v| 亚洲 欧美综合在线网络| 秋霞午夜鲁丝一区二区老狼| 成人涩涩免费视频| 久久在线观看免费| 免费看欧美女人艹b| 亚洲人123区| 久久久久久久久久看片| 色婷婷亚洲综合| 一区二区三区在线免费视频| 国产欧美一区二区在线观看| 欧美mv和日韩mv国产网站| 欧美日本一道本| 在线观看欧美精品| 色中色一区二区| 色悠久久久久综合欧美99| 99麻豆久久久国产精品免费| 成人理论电影网|