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

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

?? spihtcoder.cpp

?? 可用的基于小波的spiht算法
?? CPP
字號:
// SPIHTCoder.cpp: implementation of the CSPIHTCoder class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SPIHTCoder.h"
#include "mainfrm.h"
//#include "ImgPro.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSPIHTCoder::CSPIHTCoder()
{
	strFileNameOut = "E:\\out.spiht";
	strFileNameIn = "E:\\out.spiht";
	pNewlyAppended = NULL;
	SPIHTFile = NULL;
	MR = NULL;
	M = NULL;
	LIS = NULL;
	LIP = NULL;
	LSP = NULL;
	CompressedFileInfo.pFirstByte = NULL;
}

CSPIHTCoder::~CSPIHTCoder()
{
	if(LSP!=NULL)
		delete LSP;
	if(LIP!=NULL)
		delete LIP;
	if(LIS!=NULL)
		delete LIS;
	if(M!=NULL)
		delete M;
	if(MR!=NULL)
		delete MR;

}


void CSPIHTCoder::PutBit(char bit)
{	
    if (bit==1)
	{ 
		outputbyte|= mask;
		ones++;
	}
	else
		zeroes++;
	mask >>= 1;
	static long lByteCount = -1;
	if (mask==0)
	{
		lByteCount++;
		fwrite(&outputbyte,sizeof(unsigned char),1,SPIHTFile);
		counts++;
		outputbyte = 0;
		mask = 0x80;
	}
}

void CSPIHTCoder::DumpBuffer()
{
	if(mask!=0)
	fwrite(&outputbyte,sizeof(unsigned char),1,SPIHTFile);
	counts++;
}

void CSPIHTCoder::Initialization()
{
	/* Create and initialize list LSP */
	CLinkList::ListType d;
	LSP = new CLinkList;
	LSP->Create();

    /* Create and initialize list LIP*/
	LIP = new CLinkList;
	LIP->Create();

		d.x = 0;
		d.y = 0;
		LIP->Append(d);
		d.x = 1;
		d.y = 0;
		LIP->Append(d);
		d.x = 0;
		d.y = 1;
		LIP->Append(d);
		d.x = 1;
		d.y = 1;
		LIP->Append(d); 
						
		/* Create and initialize list LIS */
		LIS = new CLinkList;
		LIS->Create();
		d.x = 1;
		d.y = 0;
		d.type = TYPE_A;
		LIS->Append(d);
		d.x = 0;
		d.y = 1;
		LIS->Append(d);
		d.x = 1;
		d.y = 1;
		LIS->Append(d);  
		
}

BOOL CSPIHTCoder::ZeroTree(CMatrix2D<ElementType> *m, int x, int y, int threshold)
{
	int i, j, min_x, max_x, min_y, max_y;
	ElementType temp, max;
	char stop;
	
	stop = 0;
	if ((x==0) && (y==0))
	{
		temp = m->m[0][0];
		m->m[0][0] = 0;
		max = m->MaxMagnitude();
		m->m[0][0] = temp;
		if (max>=threshold) stop = 1;
	}
	else 
	{
		min_x = x << 1;
		min_y = y << 1;
		max_x = (x+1) << 1;
		max_y = (y+1) << 1;
		if ((min_x==m->col) || (min_y==m->row))
		{
			return (1);
		}
		
		max = 0;
		while ((max_y<=m->row) && (max_x<=m->col))
		{
			for (i=min_y; i<max_y; i++) 
			{
				for (j=min_x; j<max_x; j++) 
				{
					temp = abs(m->m[i][j]);
					if (temp>=threshold) 
					{
						stop = 1;
						break;
					}
				}
				if (stop==1) break;
			}
			if (stop==1) break;
			min_x <<= 1;
			max_x <<= 1;
			min_y <<= 1;
			max_y <<= 1;
		}
	}
	if (stop==1) return (0);
	return (1);
}

BOOL CSPIHTCoder::TestSubset(CMatrix2D<ElementType> *m, int x, int y, int threshold, unsigned char type)
{
    int i, j, stop;
	stop = 0;
	if(type==TYPE_A)
	   return(!ZeroTree(m,x,y,threshold));
	else
	{
		for(i=2*x; i<2*x+2; i++)
		{
		  for(j=2*y; j<2*y+2; j++)
		  {
		      if(!ZeroTree(m,i,j,threshold))
			  {
				  stop = 1;
				  break;
			  }
		  }
		  if(stop==1)
			  break;
		}
	  if(stop==1)
		 return 1;
	  else
		 return 0;
	}
}

void CSPIHTCoder::SortingPass1(CMatrix2D<ElementType> *m, int threshold)
{
	int temp, s, i, j;
	char found;
	CLinkList::ListType d, d1;
	if(stop==1)
		return;
    pNewlyAppended = LSP->end;

	/* Deal with elements in the LIP */
	LIP->Reset();
	while(LIP->current!=NULL)
	{
		d = LIP->GetCurrentElement(&found);
		if(found==0)
		{
			MessageBox(NULL,"Can't retrieve current list element..","Warning!",MB_OK);
			return;
		}
		temp = m->m[d.y][d.x];
		if(abs(temp)<threshold) 
		{
			PutBit(0);
			if(stop==1)
				return;
			LIP->current = LIP->current->next;
		}
		else
		{
			PutBit(1);
			if(temp>0)
				PutBit(1);
			else
				PutBit(0);
			if(stop==1)
				return;
			LIP->RemoveCurrentElement();
			LSP->Append(d);
		}
	}
	LIP->Reset();
	
	/* Deal with elements in the LIS */
	LIS->Reset();
	while(LIS->current!=NULL)
	{
		d = LIS->GetCurrentElement(&found);
		if(found==0)
		{
			MessageBox(NULL,"Can't retrieve current list element.",
				NULL,MB_OK);
			return;
		}
		s = TestSubset(m,d.x,d.y,threshold,d.type);
		if(d.type==TYPE_A)
		{
			PutBit((char)s);
			if(stop==1)
				return;
			if(s==1)
			{
				for(j=2*d.y; j<2*d.y+2; j++) 
				{
					for(i=2*d.x; i<2*d.x+2; i++)
					{
						d1.x = i;
						d1.y = j;
						temp = m->m[j][i];
						if(abs(temp)>=threshold)
						{
							PutBit(1);
							if(stop==1)
								return;
							LSP->Append(d1);
							if(temp>0)
								PutBit(1);
							else
								PutBit(0);
							if(stop==1)
								return;

						}
						else {
							PutBit(0);
							if(stop==1)
								return;
							LIP->Append(d1);
						}
					}
				}
				if(4*d.x+4<=m->col && 4*d.y+4<=m->row)
				{
					d1 = d;
					d1.type = TYPE_B;
					LIS->Append(d1);
				}
				LIS->RemoveCurrentElement();
			}
			else
				LIS->current =  LIS->current->next;
		}
		else
		{
			PutBit((char)s);
			if(stop==1)
				return;
			if(s==1)
			{
				for(j=2*d.y;j<2*d.y+2;j++)
					for(i=2*d.x;i<2*d.x+2;i++)
					{
						d1.x = i;
						d1.y = j;
						d1.type = TYPE_A;
						LIS->Append(d1);
					}
					LIS->RemoveCurrentElement();
			}
			else
				LIS->current = LIS->current->next;
		}
	}
	LIS->Reset();
	
}

void CSPIHTCoder::RefinementPass1(CMatrix2D<ElementType> *m, int threshold)
{
   CLinkList::ListElement *p;
   int temp;
   if(pNewlyAppended==NULL)
	   return;
   p = LSP->head;
   while(p!=pNewlyAppended->next)
   {  
	  temp = threshold & abs(m->m[p->data.y][p->data.x]);
	  if(temp==0)
	     PutBit(0);
	  else
		 PutBit(1);
	  if(stop==1)
		  return;
	  p = p->next;
   }

}




char CSPIHTCoder::GetBit()
{
	char bit;
	static long lByteCount = -1;
	if (mask==0) 
	{
		lByteCount++;
        fread(&inputbyte,sizeof(unsigned char),1,SPIHTFile);
   		mask = 0x80;
	}

	if ((inputbyte&mask)==0)
		bit = 0;
	else
		bit = 1;
	mask >>= 1;
	BitCount++;
	
	return (bit);
}

void CSPIHTCoder::SortingPass2(CMatrix2D<ElementType> *m, int threshold)
{
	int temp, s, i, j;
	char found;
	CLinkList::ListType d, d1;

	pNewlyAppended = LSP->end;
	/* Deal with elements in the LIP */
	if(stop==1)
		return;
	while(LIP->current!=NULL)
	{
		d = LIP->GetCurrentElement(&found);
		if(found==0){
			MessageBox(NULL,"error!can't get list element!\n",
				"Warning!",MB_OK);
			return;
		}
		s = GetBit();
		if(stop==1)
			return;
		if(s==0) 
		{
			LIP->current = LIP->current->next;
		}
		else
		{
			LIP->RemoveCurrentElement();
			LSP->Append(d);
			s = GetBit();
			if(stop==1)
				return;
			temp = threshold+(threshold>>1);
			if(s==1)
				m->m[d.y][d.x] = temp;
			else
				m->m[d.y][d.x] = -temp;
			
		}
	}
	LIP->Reset();
	
	/* Deal with elements in the LIS */
	while(LIS->current!=NULL)
	{
		d = LIS->GetCurrentElement(&found);
		if(found==0) {
			MessageBox(NULL,"error!can't get list element!\n",
				"Warning!",MB_OK);
			return;
		}
		if(d.type==TYPE_A)
		{
			s = GetBit();
			if(stop==1)
				return;
			if(s==1)
			{
				for(j=2*d.y; j<2*d.y+2; j++) {
					for(i=2*d.x; i<2*d.x+2; i++){
						d1.x = i;
						d1.y = j;
						s = GetBit();
						if(stop==1)
							return;
						if(s==1){
							LSP->Append(d1);
							s = GetBit();
						    if(stop==1)
							  return;
							temp = threshold+(threshold>>1); 
							if(s==1)
								m->m[j][i] = temp;
							else
								m->m[j][i] = -temp;
							
						}
						else{
							LIP->Append(d1);
						}				  
					}
				}
				if(4*d.x+4<=m->col && 4*d.y+4<=m->row)
				{
					d1 = d;
					d1.type = TYPE_B;
					LIS->Append(d1);
				}
				LIS->RemoveCurrentElement();
			}
			else
				LIS->current =  LIS->current->next;
		}
		else
		{
			s = GetBit();
			if(stop==1)
				return;
			if(s==1)
			{
				for(j=2*d.y;j<2*d.y+2;j++)
					for(i=2*d.x;i<2*d.x+2;i++)
					{
						d1.x = i;
						d1.y = j;
						d1.type = TYPE_A;
						LIS->Append(d1);
					}
					LIS->RemoveCurrentElement();
			}
			else
				LIS->current = LIS->current->next;
		}
	}
	LIS->Reset();
}

void CSPIHTCoder::RefinementPass2(CMatrix2D<ElementType> *m, int threshold)
{
	CLinkList::ListElement *p;
	int s, i, j,temp;
	if(pNewlyAppended==NULL)
	  return;
	p = LSP->head;

	while(p!=pNewlyAppended->next)
	{  
		s = GetBit();
		if(stop==1)
			return;
		i = p->data.x;
		j = p->data.y;
		temp = abs(m->m[j][i]);
		if(s==1)
			temp |= (threshold>>1);
		else{
			temp &= (~threshold);
			temp |= (threshold>>1);
		}
		if(m->m[j][i]>=0)
			m->m[j][i] = temp;
		else
			m->m[j][i] = -temp;
		p = p->next;
	}
}


void CSPIHTCoder::SetImageSize(int x, int y)
{
   nXDim = x;
   nYDim = y;
}


void CSPIHTCoder::Losslessencode(ElementType *example, int width, int height)
{
  SPIHTFile=fopen(strFileNameOut,"wb");
  SetImageSize(height, width);
  M = new CMatrix2D<ElementType>;
  M->Create(height,width);
  if (M==NULL)
  {
	  MessageBox(NULL,"Failed to create matrix!","Warning!",MB_OK);
	  return;
  }
  M->LoadData(example,height,width);
  
  /*計算閾值*/
  int nInit = (int)(floor(log10(M->MaxMagnitude())/log10(2)));
  threshold = 1 << nInit;
  
  outputbyte = 0;
  counts=0;
  mask = 0x80;
  stop = 0;
  zeroes = 0;
  ones = 0;

  /*初始化*/
  Initialization();

  while(threshold!=0)
  {
     SortingPass1(M,threshold);
	 RefinementPass1(M,threshold);
     threshold >>= 1;
	 
  }
 
  DumpBuffer();
   fclose(SPIHTFile);
   
   threshold = 1 << nInit;
   M->Destroy();
   LIP->Destroy();
   LIS->Destroy();
   LSP->Destroy();
}

void CSPIHTCoder::Losslessdecoder(int width, int height, int threshold)
{
  SPIHTFile=fopen(strFileNameIn,"rb");
  SetImageSize(height,width);
  
  MR = new CMatrix2D<ElementType>;
  MR->Create(height,width);
  if (MR==NULL) 
	  MessageBox(NULL,"Failed to create matrix!!","Warning!",MB_OK);
  MR->Clear();

  inputbyte = 0;
  mask = 0;
  BitCount = 0;
  zeroes = 0;
  ones = 0;
  stop = 0;

  Initialization();
  while(threshold!=0) 
  {
     SortingPass2(MR,threshold);
	 RefinementPass2(MR,threshold);
	 threshold >>= 1;
  }
  
  fclose(SPIHTFile);
  LIP->Destroy();
  LIS->Destroy();
  LSP->Destroy();
}














?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲黄色免费电影| 欧洲国产伦久久久久久久| 国产69精品久久99不卡| 在线精品国精品国产尤物884a| 这里只有精品99re| 国产精品黄色在线观看| 蜜臀av一区二区三区| 色哟哟一区二区在线观看| 久久青草欧美一区二区三区| 亚洲高清三级视频| caoporn国产精品| 欧美xxxx在线观看| 亚洲bt欧美bt精品777| a4yy欧美一区二区三区| 久久综合狠狠综合久久综合88 | 99国产精品久久久| 欧美大片在线观看一区| 亚洲欧美另类久久久精品2019| 经典三级在线一区| 制服丝袜亚洲精品中文字幕| 亚洲激情在线激情| 北岛玲一区二区三区四区| 2020国产精品自拍| 日本v片在线高清不卡在线观看| 91黄视频在线| 一区二区欧美精品| 91在线一区二区三区| 国产精品水嫩水嫩| 国产成人免费视频网站 | 欧美私人免费视频| 亚洲人成网站在线| 99久久精品99国产精品| 欧美激情一区二区三区| 粉嫩蜜臀av国产精品网站| 久久精品欧美日韩| 国产精品1区2区| 日韩视频国产视频| 另类小说一区二区三区| 欧美一三区三区四区免费在线看 | 色婷婷一区二区三区四区| 国产精品日日摸夜夜摸av| 国产在线一区二区综合免费视频| 欧美白人最猛性xxxxx69交| 久久不见久久见中文字幕免费| 日韩欧美国产电影| 久久精品国产精品青草| 欧美精品一区二区高清在线观看| 精品午夜一区二区三区在线观看| 久久亚洲欧美国产精品乐播| 国产成人小视频| 亚洲视频一区二区免费在线观看| 色婷婷一区二区三区四区| 亚洲午夜视频在线观看| 91.成人天堂一区| 精久久久久久久久久久| 国产免费久久精品| 色综合咪咪久久| 日一区二区三区| 久久久久久久综合日本| 99re热这里只有精品免费视频| 一区二区三区欧美日韩| 91精品久久久久久久久99蜜臂| 免费在线一区观看| 国产精品丝袜在线| 欧美亚一区二区| 麻豆91小视频| 亚洲欧洲日韩av| 欧美另类一区二区三区| 国产乱码精品1区2区3区| 亚洲欧美日韩精品久久久久| 欧美一个色资源| 成人性生交大片免费看中文| 亚洲成人综合网站| 久久久久国色av免费看影院| 91福利国产成人精品照片| 久久成人18免费观看| 综合在线观看色| 欧美xxxx老人做受| 91蝌蚪国产九色| 久久99精品久久久久| 亚洲欧洲日韩一区二区三区| 日韩欧美在线1卡| 91视频国产资源| 黄色资源网久久资源365| 一区二区三区中文免费| 亚洲高清免费观看高清完整版在线观看| 91精品国产品国语在线不卡| jlzzjlzz欧美大全| 久久99精品久久久久久国产越南| 成人免费小视频| 精品国产制服丝袜高跟| 欧美三级资源在线| 成人午夜大片免费观看| 久久se这里有精品| 亚洲成人激情自拍| 国产精品第13页| 久久久一区二区三区| 日韩一区二区三区四区| 欧美亚洲日本国产| 99re成人在线| 国产成a人无v码亚洲福利| 美腿丝袜亚洲一区| 亚洲成年人影院| 亚洲六月丁香色婷婷综合久久| 国产亚洲人成网站| 日韩精品一区二区三区视频 | 欧洲av一区二区嗯嗯嗯啊| 国产99久久久国产精品| 国产综合一区二区| 蜜桃av一区二区在线观看| 亚洲成人午夜影院| 一区二区三区四区在线| 亚洲欧美另类综合偷拍| 国产精品第四页| 国产精品久久久久久户外露出| 久久精品日韩一区二区三区| 久久色视频免费观看| 精品少妇一区二区三区| 精品精品欲导航| 欧美刺激午夜性久久久久久久| 91精品国产综合久久久久久漫画| 欧美日韩免费不卡视频一区二区三区| 色久综合一二码| 欧美吻胸吃奶大尺度电影| 欧美日精品一区视频| 欧美视频精品在线| 欧美精品久久99| 日韩视频在线观看一区二区| 日韩欧美你懂的| 久久久久久久久久久久久女国产乱| 精品国精品自拍自在线| 久久欧美一区二区| 国产精品三级av在线播放| 亚洲天堂免费看| 综合久久国产九一剧情麻豆| 亚洲综合成人在线视频| 日韩电影网1区2区| 国内精品久久久久影院一蜜桃| 国产精品一线二线三线精华| 99综合电影在线视频| 欧美在线影院一区二区| 日韩视频在线一区二区| 中文字幕成人av| 亚洲日本va在线观看| 亚洲不卡在线观看| 激情综合一区二区三区| www.欧美色图| 欧美亚洲综合久久| 精品国产99国产精品| 国产精品乱人伦中文| 亚洲高清视频在线| 激情深爱一区二区| 91色.com| 日韩精品一区二区三区视频播放| 日本一区二区成人在线| 一区二区三区美女| 国产在线精品一区二区夜色| 91在线观看地址| 日韩免费一区二区| 中文字幕一区二区三区在线播放| 亚瑟在线精品视频| 风间由美中文字幕在线看视频国产欧美 | 成人自拍视频在线观看| 欧美日韩在线直播| 美女视频免费一区| 99国产精品99久久久久久| 日韩一区二区三区视频在线| 亚洲婷婷国产精品电影人久久| 毛片av中文字幕一区二区| 91麻豆精品秘密| 精品国产91乱码一区二区三区 | bt欧美亚洲午夜电影天堂| 91麻豆精品国产无毒不卡在线观看| 久久久青草青青国产亚洲免观| 亚洲超丰满肉感bbw| 91在线高清观看| 精品成人免费观看| 亚洲韩国一区二区三区| 床上的激情91.| 日韩视频免费观看高清完整版 | 91首页免费视频| 久久久久久电影| 奇米综合一区二区三区精品视频| 91亚洲精品久久久蜜桃网站| 国产欧美一区二区在线| 免费的国产精品| 欧美日韩一区不卡| 一区二区三区蜜桃| 99久久婷婷国产综合精品| 久久久美女毛片 | 亚洲成国产人片在线观看| 成人av在线影院| 国产欧美一区二区在线| 激情综合色丁香一区二区| 91精品国产高清一区二区三区蜜臀| 一区二区在线观看不卡| 色综合久久88色综合天天| 亚洲欧洲av在线| 成人va在线观看| 亚洲欧洲精品一区二区三区 |