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

📄 infohidedoc.cpp

📁 基于混沌系统的图像加密算法
💻 CPP
📖 第 1 页 / 共 4 页
字号:
{
	y=m_size.cy-y-1;
	lpbits[(y*m_size.cy+x)*3+space]=val;
	if(lpbits[(y*m_size.cy+x)*3+space]>255)lpbits[(y*m_size.cy+x)*3+space]=255;
	if(lpbits[(y*m_size.cy+x)*3+space]<0)lpbits[(y*m_size.cy+x)*3+space]=0;
}

void CInfoHideDoc::WTSINV(float *C, int m, int N)
{
	int NK,i,k,iter,LK;
	double PI;
	PI=3.14159;
	NK=4;
	k=0;
	LK=1;
	for(iter=0;iter<m;iter++)
	{
		for(i=0;i<LK;i++)
		{
			C[k]=(float)(1.0/(float)cos((PI*(4*i+1))/NK));
			k++;
		}
		NK<<=1;
		LK<<=1;
		
	}
	
	for(i=1;i<(N-1);i++)
		C[i]/=2.0;
}

void CInfoHideDoc::IFCT(float *x, unsigned int *L, float *C, int m, int N)
{
	int NK1,NK2,i,j,k,kk,ip,incr,L1,iter;
	float T;
	x[0]=x[0]*(float)sqrt(N);
	for(i=1;i<N;i++)
		x[i]=(float)(x[i]*(float)sqrt(N)/1.4140);
	
	NK1=1;
	NK2=2;
	kk=1;
	for(i=0;i<m;i++)
		kk*=2;
	for(iter=1;iter<m;iter++)
	{
		kk>>=1;
		L1=kk-1;
		for(k=L1;k>=1;k--)
			for(i=0;i<NK1;i++)
				x[NK1+k*NK2+i]=x[NK1+k*NK2+i]+x[NK1+(k-1)*NK2+i];
			NK1<<=1;
			NK2<<=1;
			
	}
	NK1=N>>1;
	for(i=1;i<NK1;i++)
		x[i]*=2.0;
	
	
	for(i=0;i<(N-1);i++)
	{
		if(i<(int)L[i])
			continue;
		else
		{
			T=x[i];
			x[i]=x[L[i]];
			x[L[i]]=T;
		}
	}
	
	ip=1;
	kk=0;
	incr=2;
	for(iter=0;iter<m;iter++)
	{
		for(k=0;k<ip;k++)
		{
			for(j=k;j<N;j+=incr)
			{
				i=j+ip;
				T=x[j];
				x[i]=x[i]*C[kk];
				x[j]=T+x[i];
				x[i]=T-x[i];
				
			}
			kk++;
		}
		ip<<=1;
		incr<<=1;
		
		
	}
	
	kk=1;
	for(i=1;i<(N>>1);i++)
	{
		T=x[N-1];
		k=1;
		for(j=kk;j<N;j++)
		{
			x[N-k]=x[N-k-1];
			k++;
		}
		x[kk]=T;
		kk+=2;
	}
	
	for(i=0;i<N;i++)
		x[i]=x[i]/(float)(N);
}
/***************************************************************
*ProcessName:最低有效位(LSB)加密程序
***************************************************************/
void CInfoHideDoc::OnLsbE() 
{
	// TODO: Add your command handler code here
	TypeChoice tc_pdlg;
	if(tc_pdlg.DoModal()==IDOK)
	{
		if(tc_pdlg.m_wenzi)
		{
			INPUT_MW mw_pdlg;
			if(mw_pdlg.DoModal()==IDOK)
			{
				BYTE len=mw_pdlg.m_miwen.GetLength();
				BYTE *cchar;
				cchar=new BYTE[len*8];
				int i;
				for(i=0;i<len;i++)
				{
					cchar[8*i]=mw_pdlg.m_miwen[i]%2;
					cchar[8*i+1]=(mw_pdlg.m_miwen[i]>>1)%2;
					cchar[8*i+2]=(mw_pdlg.m_miwen[i]>>2)%2;
					cchar[8*i+3]=(mw_pdlg.m_miwen[i]>>3)%2;
					cchar[8*i+4]=(mw_pdlg.m_miwen[i]>>4)%2;
					cchar[8*i+5]=(mw_pdlg.m_miwen[i]>>5)%2;
					cchar[8*i+6]=(mw_pdlg.m_miwen[i]>>6)%2;
					cchar[8*i+7]=(mw_pdlg.m_miwen[i]>>7)%2;
				}
				
				lpbits[(m_size.cx*m_size.cy-1)*3]=(lpbits[(m_size.cx*m_size.cy-1)*3]>>1<<1)+len%2;
				lpbits[(m_size.cx*m_size.cy-2)*3]=(lpbits[(m_size.cx*m_size.cy-2)*3]>>1<<1)+(len>>1)%2;
				lpbits[(m_size.cx*m_size.cy-3)*3]=(lpbits[(m_size.cx*m_size.cy-3)*3]>>1<<1)+(len>>2)%2;
				lpbits[(m_size.cx*m_size.cy-4)*3]=(lpbits[(m_size.cx*m_size.cy-4)*3]>>1<<1)+(len>>3)%2;
				lpbits[(m_size.cx*m_size.cy-5)*3]=(lpbits[(m_size.cx*m_size.cy-5)*3]>>1<<1)+(len>>4)%2;
				lpbits[(m_size.cx*m_size.cy-6)*3]=(lpbits[(m_size.cx*m_size.cy-6)*3]>>1<<1)+(len>>5)%2;
				lpbits[(m_size.cx*m_size.cy-7)*3]=(lpbits[(m_size.cx*m_size.cy-7)*3]>>1<<1)+(len>>6)%2;
				lpbits[(m_size.cx*m_size.cy-8)*3]=(lpbits[(m_size.cx*m_size.cy-8)*3]>>1<<1)+(len>>7)%2;

				len=len*8;
				i=0;
				while(1){
					lpbits[i*3]=(lpbits[i*3]>>1<<1)+cchar[i];
					i=i+1;
					if(i==len)break;
				}
				free(cchar);
			}
			UpdateAllViews(NULL);
			SetModifiedFlag();
		}
		
		if(tc_pdlg.m_tuxiang)
		{
			JM_PIC jp_pdlg;
			if(jp_pdlg.DoModal()==IDOK)
			{
				CFile fp;//指定的位图文件
				fp.Open(jp_pdlg.m_picinfo,CFile::modeRead);

				fp.Read((LPSTR)&mm_bmh,sizeof(BITMAPFILEHEADER));
				if(mm_bmh.bfType!=0x4D42)//判断文件是否为位图
				{
					AfxMessageBox("不是合法的文件!");
					fp.Close();
					return;
				}
				
				DWORD dwBitsSize=mm_bmh.bfSize;
				mm_lpbmi=(BITMAPINFO*)GlobalAllocPtr(GHND,dwBitsSize-sizeof(BITMAPFILEHEADER));
				
				fp.Read(mm_lpbmi,dwBitsSize-sizeof(BITMAPFILEHEADER));
				
				if((mm_lpbmi->bmiHeader.biBitCount!=24)||(mm_lpbmi->bmiHeader.biCompression!=BI_RGB))
				{//判断该位图是否为24位非压缩位图
					AfxMessageBox("该位图不是我们需要的24位位图!");
					GlobalFreePtr(mm_lpbmi);
					mm_lpbmi=NULL;
					fp.Close();
					return;
				}
				
				mm_lpbits=(LPBYTE)mm_lpbmi+sizeof(BITMAPINFOHEADER);
				
				mm_m_size.cx=mm_lpbmi->bmiHeader.biWidth;//得到位图宽度
				mm_m_size.cy=mm_lpbmi->bmiHeader.biHeight;//得到位图高度
				
				fp.Close();//关闭文件
					
				int b_times;//求得载体图像与秘密图像的比例
				b_times=m_size.cx/mm_m_size.cx;

				for(int i=0;i<mm_m_size.cy;i++)
					for(int j=0;j<mm_m_size.cx;j++)
					{
						lpbits[((i*mm_m_size.cx+j)*8)*3]=(lpbits[((i*mm_m_size.cx+j)*8)*3]>>1<<1)
							+mm_lpbits[(i*mm_m_size.cx+j)*3]%2;
						lpbits[((i*mm_m_size.cx+j)*8+1)*3]=(lpbits[((i*mm_m_size.cx+j)*8+1)*3]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>1)%2;
						lpbits[((i*mm_m_size.cx+j)*8+2)*3]=(lpbits[((i*mm_m_size.cx+j)*8+2)*3]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>2)%2;
						lpbits[((i*mm_m_size.cx+j)*8+3)*3]=(lpbits[((i*mm_m_size.cx+j)*8+3)*3]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>3)%2;
						lpbits[((i*mm_m_size.cx+j)*8+4)*3]=(lpbits[((i*mm_m_size.cx+j)*8+4)*3]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>4)%2;
						lpbits[((i*mm_m_size.cx+j)*8+5)*3]=(lpbits[((i*mm_m_size.cx+j)*8+5)*3]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>5)%2;
						lpbits[((i*mm_m_size.cx+j)*8+6)*3]=(lpbits[((i*mm_m_size.cx+j)*8+6)*3]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>6)%2;
						lpbits[((i*mm_m_size.cx+j)*8+7)*3]=(lpbits[((i*mm_m_size.cx+j)*8+7)*3]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3]>>7)%2;

						lpbits[((i*mm_m_size.cx+j)*8)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8)*3+1]>>1<<1)
							+mm_lpbits[(i*mm_m_size.cx+j)*3+1]%2;
						lpbits[((i*mm_m_size.cx+j)*8+1)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+1)*3+1]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>1)%2;
						lpbits[((i*mm_m_size.cx+j)*8+2)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+2)*3+1]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>2)%2;
						lpbits[((i*mm_m_size.cx+j)*8+3)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+3)*3+1]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>3)%2;
						lpbits[((i*mm_m_size.cx+j)*8+4)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+4)*3+1]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>4)%2;
						lpbits[((i*mm_m_size.cx+j)*8+5)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+5)*3+1]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>5)%2;
						lpbits[((i*mm_m_size.cx+j)*8+6)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+6)*3+1]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>6)%2;
						lpbits[((i*mm_m_size.cx+j)*8+7)*3+1]=(lpbits[((i*mm_m_size.cx+j)*8+7)*3+1]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+1]>>7)%2;

						lpbits[((i*mm_m_size.cx+j)*8)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8)*3+2]>>1<<1)
							+mm_lpbits[(i*mm_m_size.cx+j)*3+2]%2;
						lpbits[((i*mm_m_size.cx+j)*8+1)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+1)*3+2]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>1)%2;
						lpbits[((i*mm_m_size.cx+j)*8+2)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+2)*3+2]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>2)%2;
						lpbits[((i*mm_m_size.cx+j)*8+3)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+3)*3+2]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>3)%2;
						lpbits[((i*mm_m_size.cx+j)*8+4)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+4)*3+2]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>4)%2;
						lpbits[((i*mm_m_size.cx+j)*8+5)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+5)*3+2]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>5)%2;
						lpbits[((i*mm_m_size.cx+j)*8+6)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+6)*3+2]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>6)%2;
						lpbits[((i*mm_m_size.cx+j)*8+7)*3+2]=(lpbits[((i*mm_m_size.cx+j)*8+7)*3+2]>>1<<1)
							+(mm_lpbits[(i*mm_m_size.cx+j)*3+2]>>7)%2;
					}
					lpbits[(m_size.cx*m_size.cy-1)*3]=(lpbits[(m_size.cx*m_size.cy-1)*3]>>1<<1)+mm_m_size.cx%2;
					lpbits[(m_size.cx*m_size.cy-2)*3]=(lpbits[(m_size.cx*m_size.cy-2)*3]>>1<<1)+(mm_m_size.cx>>1)%2;
					lpbits[(m_size.cx*m_size.cy-3)*3]=(lpbits[(m_size.cx*m_size.cy-3)*3]>>1<<1)+(mm_m_size.cx>>2)%2;
					lpbits[(m_size.cx*m_size.cy-4)*3]=(lpbits[(m_size.cx*m_size.cy-4)*3]>>1<<1)+(mm_m_size.cx>>3)%2;
					lpbits[(m_size.cx*m_size.cy-5)*3]=(lpbits[(m_size.cx*m_size.cy-5)*3]>>1<<1)+(mm_m_size.cx>>4)%2;
					lpbits[(m_size.cx*m_size.cy-6)*3]=(lpbits[(m_size.cx*m_size.cy-6)*3]>>1<<1)+(mm_m_size.cx>>5)%2;
					lpbits[(m_size.cx*m_size.cy-7)*3]=(lpbits[(m_size.cx*m_size.cy-7)*3]>>1<<1)+(mm_m_size.cx>>6)%2;
					lpbits[(m_size.cx*m_size.cy-8)*3]=(lpbits[(m_size.cx*m_size.cy-8)*3]>>1<<1)+(mm_m_size.cx>>7)%2;	
			}
			UpdateAllViews(NULL);
			SetModifiedFlag();
		}

//声音隐藏算法暂时没做,可继续完成,原理相同
/*
		if(tc_pdlg.m_shengyin)
		{
		}
*/
	}
	UpdateAllViews(NULL);
	SetModifiedFlag();
}
/***************************************************************
*ProcessName:最低有效位(LSB)解密程序
***************************************************************/
void CInfoHideDoc::OnLsbD() 
{
	// TODO: Add your command handler code here
	TypeChoice tc_pdlg;
	if(tc_pdlg.DoModal()==IDOK)
	{
		if(tc_pdlg.m_wenzi)
		{
			int len;
			len=lpbits[(m_size.cx*m_size.cy-1)*3]%2+(lpbits[(m_size.cx*m_size.cy-2)*3]%2)*2
				+(lpbits[(m_size.cx*m_size.cy-3)*3]%2)*4+(lpbits[(m_size.cx*m_size.cy-4)*3]%2)*8
				+(lpbits[(m_size.cx*m_size.cy-5)*3]%2)*16+(lpbits[(m_size.cx*m_size.cy-6)*3]%2)*32
				+(lpbits[(m_size.cx*m_size.cy-7)*3]%2)*64+(lpbits[(m_size.cx*m_size.cy-8)*3]%2)*128;
			
			char *cchar;
			cchar=new char[len];
			cchar[len]='\0';
			for(int i=0;i<len*8;i=i+8)
			{
				cchar[i/8]=lpbits[i*3]%2+(lpbits[(i+1)*3]%2)*2
					+(lpbits[(i+2)*3]%2)*4+(lpbits[(i+3)*3]%2)*8
					+(lpbits[(i+4)*3]%2)*16+(lpbits[(i+5)*3]%2)*32
					+(lpbits[(i+6)*3]%2)*64+(lpbits[(i+7)*3]%2)*128;
			}
			CString chprint=cchar;
			AfxMessageBox(chprint);
		}
	
		if(tc_pdlg.m_tuxiang)
		{
			int len;
			len=lpbits[(m_size.cx*m_size.cy-1)*3]%2+(lpbits[(m_size.cx*m_size.cy-2)*3]%2)*2
				+(lpbits[(m_size.cx*m_size.cy-3)*3]%2)*4+(lpbits[(m_size.cx*m_size.cy-4)*3]%2)*8
				+(lpbits[(m_size.cx*m_size.cy-5)*3]%2)*16+(lpbits[(m_size.cx*m_size.cy-6)*3]%2)*32
				+(lpbits[(m_size.cx*m_size.cy-7)*3]%2)*64+(lpbits[(m_size.cx*m_size.cy-8)*3]%2)*128;
			
			mm_lpbits=new unsigned char[len*len*3];
			for(int i=0;i<len;i++)
				for(int j=0;j<len;j++)
				{
					mm_lpbits[(i*len+j)*3]=(lpbits[((i*len+j)*8)*3]%2)+(lpbits[((i*len+j)*8+1)*3]%2)*2
						+(lpbits[((i*len+j)*8+2)*3]%2)*4+(lpbits[((i*len+j)*8+3)*3]%2)*8
						+(lpbits[((i*len+j)*8+4)*3]%2)*16+(lpbits[((i*len+j)*8+5)*3]%2)*32
						+(lpbits[((i*len+j)*8+6)*3]%2)*64+(lpbits[((i*len+j)*8+7)*3]%2)*128;

					mm_lpbits[(i*len+j)*3+1]=(lpbits[((i*len+j)*8)*3+1]%2)+(lpbits[((i*len+j)*8+1)*3+1]%2)*2
						+(lpbits[((i*len+j)*8+2)*3+1]%2)*4+(lpbits[((i*len+j)*8+3)*3+1]%2)*8
						+(lpbits[((i*len+j)*8+4)*3+1]%2)*16+(lpbits[((i*len+j)*8+5)*3+1]%2)*32
						+(lpbits[((i*len+j)*8+6)*3+1]%2)*64+(lpbits[((i*len+j)*8+7)*3+1]%2)*128;

					mm_lpbits[(i*len+j)*3+2]=(lpbits[((i*len+j)*8)*3+2]%2)+(lpbits[((i*len+j)*8+1)*3+2]%2)*2
						+(lpbits[((i*len+j)*8+2)*3+2]%2)*4+(lpbits[((i*len+j)*8+3)*3+2]%2)*8
						+(lpbits[((i*len+j)*8+4)*3+2]%2)*16+(lpbits[((i*len+j)*8+5)*3+2]%2)*32
						+(lpbits[((i*len+j)*8+6)*3+2]%2)*64+(lpbits[((i*len+j)*8+7)*3+2]%2)*128;
				}
			for(i=0;i<len*len*3;i++)lpbits[i]=mm_lpbits[i];
			mm_m_size.cx=len;	
			mm_m_size.cy=len;
			mm_lpbmi->bmiHeader.biWidth=len;
			mm_lpbmi->bmiHeader.biHeight=len;
			mm_lpbmi->bmiHeader.biSizeImage=len*len*3;
			mm_bmh.bfSize=len*len*3+54;
			trans=1;
			UpdateAllViews(NULL);
			SetModifiedFlag();
		}

//声音隐藏算法暂时没做,可继续完成,原理相同
/*
		if(tc_pdlg.m_shengyin)
		{
		}
*/
	}
}
/***************************************************************
*ProcessName:BMP格式转换为JPEG格式程序
***************************************************************/
void CInfoHideDoc::OnBmp2jpeg() 
{
	// TODO: Add your command handler code here
	BMPTOJPEG2K b2j_pdlg;
	b2j_pdlg.DoModal();
}

void CInfoHideDoc::OnRgbtogray() 
{
	// TODO: Add your command handler code here
	BYTE *buffer;
	buffer=new BYTE[m_size.cx*m_size.cy];
	int i,j;
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			buffer[i*m_size.cx+j]=(BYTE)(lpbits[(i*m_size.cx+j)*3]*0.3+
				lpbits[(i*m_size.cx+j)*3+1]*0.59+lpbits[(i*m_size.cx+j)*3+2]*0.11);
		} 
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			lpbits[1024+i*m_size.cx+j]=buffer[i*m_size.cx+j];
		}
	lpbits=lpbits+1024;
	bmh.bfSize=m_size.cx*m_size.cy+1078;
	bmh.bfOffBits=1078;
	lpbmi->bmiHeader.biBitCount=8;
	lpbmi->bmiHeader.biSizeImage=m_size.cx*m_size.cy;
	for(i=0;i<256;i++)
	{
		lpbmi->bmiColors[i].rgbRed =(BYTE)i;
		lpbmi->bmiColors[i].rgbGreen =(BYTE)i;
		lpbmi->bmiColors[i].rgbBlue =(BYTE)i;
		lpbmi->bmiColors[i].rgbReserved=(BYTE)i;
	}
	free(buffer);
	buffer=NULL;
	UpdateAllViews(NULL);
	SetModifiedFlag();
}

void CInfoHideDoc::OnRgbto2() 
{
	// TODO: Add your command handler code here
	BYTE *buffer;
	buffer=new BYTE[m_size.cx*m_size.cy];
	int i,j;
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			if((lpbits[(i*m_size.cx+j)*3]*0.3+
				lpbits[(i*m_size.cx+j)*3+1]*0.59+lpbits[(i*m_size.cx+j)*3+2]*0.11)>127)
				buffer[i*m_size.cx+j]=1;
			else buffer[i*m_size.cx+j]=0;
		}
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j=j+8)
		{
			lpbits[8+(i*m_size.cx+j)/8]=(buffer[i*m_size.cx+j]<<7)+(buffer[i*m_size.cx+j+1]<<6)
				+(buffer[i*m_size.cx+j+2]<<5)+(buffer[i*m_size.cx+j+3]<<4)
				+(buffer[i*m_size.cx+j+4]<<3)+(buffer[i*m_size.cx+j+5]<<2)
				+(buffer[i*m_size.cx+j+6]<<1)+(buffer[i*m_size.cx+j+7]);
		}
	lpbits=lpbits+8;
	bmh.bfSize=m_size.cx*m_size.cy/8+62;
	bmh.bfOffBits=62;
	lpbmi->bmiHeader.biBitCount=1;
	lpbmi->bmiHeader.biSizeImage=m_size.cx*m_size.cy/8;
			
	lpbmi->bmiColors[0].rgbRed =(BYTE)0;
	lpbmi->bmiColors[0].rgbGreen =(BYTE)0;
	lpbmi->bmiColors[0].rgbBlue =(BYTE)0;
	lpbmi->bmiColors[0].rgbReserved=(BYTE)0;
	lpbmi->bmiColors[1].rgbRed =(BYTE)255;
	lpbmi->bmiColors[1].rgbGreen =(BYTE)255;
	lpbmi->bmiColors[1].rgbBlue =(BYTE)255;
	lpbmi->bmiColors[1].rgbReserved=(BYTE)255;
	
	free(buffer);
	buffer=NULL;
	UpdateAllViews(NULL);
	SetModifiedFlag();
}

unsigned char BayerPattern[8][8]={0,32, 8,40, 2,34,10,42,
									48,16,56,24,50,18,58,26,
									12,44, 4,36,14,46, 6,38,
									60,28,52,20,62,30,54,22,
									3,35,11,43, 1,33, 9,41,
									51,19,59,27,49,17,57,25,
									15,47, 7,39,13,45, 5,37,
									63,31,55,23,61,29,53,21};

#define ISPAL_PATTERN_SIZE		64			/* 离散数据最大尺寸 */
#define ISPAL_BEGIN		        64			/* 调色板分量起始量 */
#define ISPAL_END		    	224			/* 调色板分量最高值 */
#define ISPAL_STEP			    32			/* 调色板分量间隔 */


void CInfoHideDoc::OnRgbto256() 
{
	// TODO: Add your command handler code here
	int i,j;
	BYTE *buffer;
	buffer=new BYTE[m_size.cx*m_size.cy];
	unsigned long *pal_buffer;
	pal_buffer=new unsigned long[256];
	Creat256Palette(pal_buffer);
	
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			buffer[i*m_size.cx+j]=(BYTE)(CnvTo256PalIndex(j,i,lpbits[(i*m_size.cx+j)*3+2],
				lpbits[(i*m_size.cx+j)*3+1],lpbits[(i*m_size.cx+j)*3]));
		} 
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			lpbits[1024+i*m_size.cx+j]=buffer[i*m_size.cx+j];
		}
	lpbits=lpbits+1024;
	bmh.bfSize=m_size.cx*m_size.cy+1078;
	bmh.bfOffBits=1078;
	lpbmi->bmiHeader.biBitCount=8;
	lpbmi->bmiHeader.biSizeImage=m_size.cx*m_size.cy;
	for(i=0;i<256;i++)
	{
		lpbmi->bmiColors[i].rgbRed =(BYTE)((pal_buffer[i]>>16)%256);
		lpbmi->bmiColors[i].rgbGreen =(BYTE)((pal_buffer[i]>>8)%256);
		lpbmi->bmiColors[i].rgbBlue =(BYTE)(pal_buffer[i]%256);
		lpbmi->bmiColors[i].rgbReserved=(BYTE)i;
	}
			
	free(buffer);
	buffer=NULL;
	UpdateAllViews(NULL);
	SetModifiedFlag();
}

int CInfoHideDoc::Creat256Palette(unsigned long *pal)
{
	unsigned long r, g, b;
	int	cnt = 0;
	
	/* 标准调色板 */
	for (r=ISPAL_BEGIN; r<256; r+=ISPAL_STEP)
	{
		for (g=ISPAL_BEGIN; g<256; g+=ISPAL_STEP)
		{
			for (b=ISPAL_BEGIN; b<256; b+=ISPAL_STEP)
			{

⌨️ 快捷键说明

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