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

📄 multimark.cpp

📁 十分详细的基于Wavelet的图像水印嵌入程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			{				
				
				for(x=0;x<8;x++)
				{
					for(y=0;y<8;y++)
					{
						T[y][x]=0;
					}
				}
				for(x=0;x<4;x++)
				{
					for(y=0;y<4;y++)
					{
						T[y][x]=nRemain[j][i][y][x];
					}
				}
	
				//**********************************
				//**********************************

				Dct.FloatIDCT(T);
				for(x=0;x<8;x++)

				{
					for(y=0;y<8;y++)
					{
						*(pnCover+(i*8+x)*64+j*8+y)=(int)T[y][x];
					}
				}
			}
		}
	}
	//*****************************************************
	//*****************************************************
	//**********测试
	if(pDoc->m_nBitCount==8)
	{
		for(i=0;i<m_nMarkHeight;i++)
		{
			for(j=0;j<m_nMarkWidth;j++)
			{
				*(pn+(i+nPointy)*pDoc->m_nWidth+(nPointx+j))=*(pnCover+i*64+j);
			}
		}
	}
	else if(pDoc->m_nBitCount==24)
	{
		for(i=0;i<m_nMarkHeight;i++)
		{
			for(j=0;j<m_nMarkWidth;j++)
			{
				*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j))=*(pnCover+3*i*64+3*j);
				*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j)+1)=*(pnCover+3*i*64+3*j+1);
				*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j)+2)=*(pnCover+3*i*64+3*j+2);
			}
		}
	}

	//*************************************************************
	//*************************************************************
	
	if(pDoc->m_nBitCount==24)
	{
		for(j=0;j<pDoc->m_nHeight;j++){
			for(i=0;i<pDoc->m_nWidth ;i++){
				for(l=0;l<3;l++){
					*pDoc->m_Dib.m_lpImage=(BYTE)*pDoc->m_pnPic;
					pDoc->m_pnPic=pDoc->m_pnPic+1;
					pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+1;						
				}						//for l
			}							//for i
			if(((pDoc->m_nWidth*3)%4)!=0){		//加入附加字节
				pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+4-((pDoc->m_nWidth*3)%4);
			}
		}
	}else if(pDoc->m_nBitCount==8)
	{
		for(j=0;j<pDoc->m_nHeight;j++){
			for(i=0;i<pDoc->m_nWidth ;i++){
				*pDoc->m_Dib.m_lpImage=(BYTE)*pDoc->m_pnPic;
				pDoc->m_pnPic=pDoc->m_pnPic+1;
				pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+1;				
			
			}							//for i
			if(((pDoc->m_nWidth)%4)!=0){		//加入附加字节
				pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+4-((pDoc->m_nWidth)%4);
			}
		}
	}
	pDoc->m_Dib.m_lpImage=pb;
	pDoc->m_pnPic=pn;

	int nSizeWidth=(nMarkWidth*3+3)/4*4;
	BITMAPFILEHEADER BF;
	BITMAPINFOHEADER BI;

	BF.bfOffBits =54;
	BF.bfReserved1 =0;
	BF.bfReserved2 =0;
	BF.bfSize =int((nMarkWidth*3 + 3) / 4) * 4;
	BF.bfType =19778;

	BI.biBitCount =24;
	BI.biClrImportant =0;
	BI.biClrUsed =0;
	BI.biCompression =0;
	BI.biHeight =nMarkHeight;
	BI.biPlanes =1;
	BI.biSize =40;
	BI.biSizeImage =0;
	BI.biWidth =nMarkWidth;
	BI.biXPelsPerMeter =0;
	BI.biYPelsPerMeter =0;

	CString sFileName="c:\\temp.bmp";
	fOutFile.Open (sFileName,CFile::modeCreate | CFile::modeWrite );
	fOutFile.Write((LPVOID) &BF, sizeof(BITMAPFILEHEADER));
	fOutFile.Write((LPVOID) &BI,  sizeof(BITMAPINFOHEADER));
	fOutFile.Write ((LPVOID) pbMarkDraw, nMarkHeight*nSizeWidth );
	fOutFile.Close();	
	free(pbMarkDraw);

	fOutFile.Open(sFileName,CFile::modeRead);
	m_dibDrawMark.Read(&fOutFile);
	fOutFile.Close();
	Invalidate();		
}

void CMultiMarkView::OnMWeakRuban() 
{
	CMultiMarkDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	int *pnI;
	long i,temp,j,l;
	long lgSizePicture;
	int *pn;
	BYTE *pb;
	pb=pDoc->m_Dib.m_lpImage;
	pn=pDoc->m_pnPic;
	int xBlock=8,yBlock=8;
	int nMW,nMH;
	int nW,nH;
	int nMarkTemp;		//水印数据临时变量  

	nMW=m_nMarkWidth;
	nMH=m_nMarkHeight;
	nW=pDoc->m_nWidth;
	nH=pDoc->m_nHeight;

	BYTE *pbDrawR,*pbDrawW;
	pbDrawR=new BYTE[64*64];
	pbDrawW=new BYTE[64*64];

//	int nPointR[64][64][2];
	long lN=13453,lS=3241;
	int x,y;
	
	if(nMW!=64 || nMH!=64)
	{
		MessageBox("仅对64*64的二值水印成立");
		return;
	}

	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//++++++++++++++++++产生随机序列
	for(i=0;i<64;i++)
	{
		for(j=0;j<64;j++)
		{
			for(x=0;x<2;x++)
			{
				lS=(lS*lS+4*lS+1)%lN;
				nPointR[j][i][x]=(int)lS%8;
			}
		}
	}
//**************************************************************************
//**************************************************************************
//融合图像进行整数小波变换,将DCT系数嵌入到中间
	lgSizePicture=(long)pDoc->m_nHeight*(long)pDoc->m_nWidth;
	
	pnI= new int [(long)pDoc->m_nHeight*(long)pDoc->m_nWidth];

	
	if( pDoc->m_nBitCount== 8 )
	{

		for( i = 0; i < lgSizePicture; i++ )	
			*( pnI + i) = (*( pDoc->m_pnPic+i)-128);

		m_IntWT.IntWT_2D( pnI, pDoc->m_nHeight, pDoc->m_nWidth, 1, 1 );

		//++++++++++++++++++++++++++++++++++++++++++++++
		//++++++++++++++++++++++++++++++++++++++++++++++
		//+++++信息隐藏
		for(i=0;i<nMH;i++)
		{
			for(j=0;j<nMW;j++)
			{
				if(m_pnMark[3*i*nMW+j*3]>128)
				{
					nMarkTemp=0;
				}else
					nMarkTemp=1;
				for(x=0;x<8;x++)
				{
					for(y=0;y<8;y++)
					{
						if(x==nPointR[j][i][0] && y==nPointR[j][i][1])
						{
							if(pnI[(8*i+x)*nW+8*j+y]>=0)
							{
								pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/16*16+8*nMarkTemp;
							}else
								pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/16*16-8*nMarkTemp;
						}else 
						{
							if(pnI[(8*i+x)*nW+8*j+y]>=0)
							{
								pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/2*2+1*nMarkTemp;
							}else
								pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/2*2-1*nMarkTemp;
						}
					}
				}
			}
		}

		//信息提取测试 
		for(i=0;i<nMH;i++)
		{
			for(j=0;j<nMW;j++)
			{
				//if(pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16<8 && pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16>(-8))
				if(pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16==0)
				{
					pbDrawR[i*nMW+j]=255;
				}else
					pbDrawR[i*nMW+j]=0;
				
			}
		}
        //++++++++++++++++++++++++++++++++++++++++++++++++
		//++++++++++++++++++++++++++++++++++++++++++++++++

		m_IntWT.IntWT_2D_I( pnI, pDoc->m_nHeight, pDoc->m_nWidth, 1, 1 );	
		
		for(i=0;i<lgSizePicture;i++)
		{
			if((*(pnI+i)+128)<0)
			{
				temp=0;
			}
			else if((*(pnI+i)+128)>255)
			{
				temp=255;
			}
			else
				temp=(int)(*(pnI+i)+128);

			*(pnI+i)=temp;
		}
		
		memcpy( pDoc->m_pnPic, pnI, sizeof(int)*lgSizePicture );

	}
	else if( pDoc->m_nBitCount==24 )
	{
		for(int p=0;p<3;p++)
		{
			for( i = 0; i < lgSizePicture; i++ )	
				*( pnI + i) = (*( pDoc->m_pnPic+3*i+p)-128);

			m_IntWT.IntWT_2D( pnI, pDoc->m_nHeight, pDoc->m_nWidth, 1, 1 );
			
			m_IntWT.IntWT_2D_I( pnI, pDoc->m_nHeight, pDoc->m_nWidth, 1, 1 );	

			for(i=0;i<lgSizePicture;i++)
			{
				if((*(pnI+i)+128)<0)
				{
					temp=0;
				}
				else if((*(pnI+i)+128)>255)
				{
					temp=255;
				}
				else
					temp=(int)(*(pnI+i)+128);

				*(pnI+i)=temp;
			}
			
			for( i = 0; i < lgSizePicture; i++ )	
				*( pDoc->m_pnPic+3*i+p)= (*( pnI + i));
		}

	}
		
	delete[] pnI;
	//*****************************************************
	//*****************************************************
	//**********测试
/*	if(pDoc->m_nOriBitCount==8)
	{
		for(i=0;i<m_nMarkHeight;i++)
		{
			for(j=0;j<m_nMarkWidth;j++)
			{
				*(pn+(i+nPointy)*pDoc->m_nWidth+(nPointx+j))=*(pnCover+i*m_nMarkWidth+j);
			}
		}
	}
	else if(pDoc->m_nOriBitCount==24)
	{
		for(i=0;i<m_nMarkHeight;i++)
		{
			for(j=0;j<m_nMarkWidth;j++)
			{
				*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j))=*(pnCover+3*i*m_nMarkWidth+3*j);
				*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j)+1)=*(pnCover+3*i*m_nMarkWidth+3*j+1);
				*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j)+2)=*(pnCover+3*i*m_nMarkWidth+3*j+2);
			}
		}
	}*/

	//*************************************************************
	//*************************************************************
	
	if(pDoc->m_nBitCount==24)
	{
		for(j=0;j<pDoc->m_nHeight;j++){
			for(i=0;i<pDoc->m_nWidth ;i++){
				for(l=0;l<3;l++){
					*pDoc->m_Dib.m_lpImage=(BYTE)*pDoc->m_pnPic;
					pDoc->m_pnPic=pDoc->m_pnPic+1;
					pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+1;						
				}						//for l
			}							//for i
			if(((pDoc->m_nWidth*3)%4)!=0){		//加入附加字节
				pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+4-((pDoc->m_nWidth*3)%4);
			}
		}
	}else if(pDoc->m_nBitCount==8)
	{
		for(j=0;j<pDoc->m_nHeight;j++){
			for(i=0;i<pDoc->m_nWidth ;i++){
				*pDoc->m_Dib.m_lpImage=(BYTE)*pDoc->m_pnPic;
				pDoc->m_pnPic=pDoc->m_pnPic+1;
				pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+1;						
			
			}							//for i
			if(((pDoc->m_nWidth)%4)!=0){		//加入附加字节
				pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+4-((pDoc->m_nWidth)%4);
			}
		}
	}
	pDoc->m_Dib.m_lpImage=pb;
	pDoc->m_pnPic=pn;

	for(i=0;i<64*64;i++)
	{
		for(j=0;j<3;j++)
		{
			m_dibMark.m_lpImage[i*3+j]=pbDrawR[i];
		}
	}

	Invalidate();			
}

void CMultiMarkView::OnMWeakRubanDraw() 
{
	CMultiMarkDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	int *pnI;
	long i,j;
	long lgSizePicture;
	int *pn;
	BYTE *pb;
	pb=pDoc->m_Dib.m_lpImage;
	pn=pDoc->m_pnPic;

	int xBlock=8,yBlock=8;
	int nMW,nMH;
	int nW,nH;
//	int nMarkTemp;		//水印数据临时变量  

	nMW=64;
	nMH=64;
	nW=pDoc->m_nWidth;
	nH=pDoc->m_nHeight;

//	int nPointR[64][64][2];
	long lN=13453,lS=3241;
	int x,y;
	
	
	BYTE *pbDrawR,*pbDrawW;
	pbDrawR=new BYTE[64*64];
	pbDrawW=new BYTE[64*64];
	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//++++++++++++++++++产生随机序列
/*	for(i=0;i<64;i++)
	{
		for(j=0;j<64;j++)
		{
			for(x=0;x<2;x++)
			{
				lS=(lS*lS+4*lS+1)%lN;
				nPointR[j][i][x]=(int)lS%8;
			}
		}
	}*/

	//在8*8的方块中随机选取图像数据嵌入的位置,将图像分成64*64个8*8的数据块
	for(i=0;i<64;i++)
	{
		for(j=0;j<64;j++)
		{
			for(x=0;x<2;x++)
			{
				lS=(lS*lS+4*lS+1)%lN;
				nPointR[j][i][x]=(int)lS%8;
			}
		}
	}
//**************************************************************************
//**************************************************************************
	lgSizePicture=(long)pDoc->m_nHeight*(long)pDoc->m_nWidth;
	
	pnI= new int[(long)pDoc->m_nHeight*(long)pDoc->m_nWidth];

	
	if( pDoc->m_nBitCount== 8 )
	{

		for( i = 0; i < lgSizePicture; i++ )	
			*( pnI + i) = (*( pDoc->m_pnPic+i)-128);

		m_IntWT.IntWT_2D( pnI, pDoc->m_nHeight, pDoc->m_nWidth, 1, 1 );

		//++++++++++++++++++++++++++++++++++++++++++++++
		//++++++++++++++++++++++++++++++++++++++++++++++
		//+++++信息提取
		for(i=0;i<nMH;i++)
		{
			for(j=0;j<nMW;j++)
			{
				//if(pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16<8 && pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16>(-8))
				if(pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16==0)
				{
					pbDrawR[i*nMW+j]=255;
				}else
					pbDrawR[i*nMW+j]=0;
				for(x=0;x<8;x++)
				{
					for(y=0;y<8;y++)
					{
						if(x!=nPointR[j][i][0] || y!=nPointR[j][i][1])
						{
							if(pnI[(8*i+x)*nW+8*j+y]%2==0)
							{
								pbDrawW[i*nMW+j]=255;
							}else
								pbDrawW[i*nMW+j]=0;
						} 
					}
				}
			}
		}
	}


/*

for(i=0;i<nMH;i++)
		{
			for(j=0;j<nMW;j++)
			{
				if(m_pnMark[i*nMW+j]>128)
				{
					nMarkTemp=0;
				}else
					nMarkTemp=1;
				for(x=0;x<8;x++)
				{
					for(y=0;y<8;y++)
					{
						if(x==nPointR[j][i][0] && y==nPointR[j][i][1])
						{
							if(pnI[(8*i+x)*nW+8*j+y]>=0)
							{
								pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/16*16+8*nMarkTemp;
							}else
								pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/16*16-8*nMarkTemp;
						}else 
						{
							if(pnI[(8*i+x)*nW+8*j+y]>=0)
							{
								pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/2*2+1*nMarkTemp;
							}else
								pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/2*2-1*nMarkTemp;
						}
					}
				}


*/
	for(i=0;i<64*64;i++)
	{
		for(j=0;j<3;j++)
		{
			m_dibMark.m_lpImage[i*3+j]=pbDrawW[i];
		}
	}
        
	delete[] pnI;
	Invalidate();			
}

void CMultiMarkView::BlockValue(int *pnX)
{
	long i,j;
	int k;
	int nTW=512;
	int nLevel=4;
	int nCount=0;

	//这里嵌入水印信息的系数不包括LL层系数
	int nLay=1;
	
	for(i=0;i<512;i++)				//将线性一维数组转化为二维数组
	{
		for(j=0;j<512;j++)
		{
			nTemp[i][j]=pnX[i*512+j];
		}
	}

	nTW=nTW>>nLevel;				//计算最底层块的数据宽度

	for(k=0;k<2;k++)				//将需要扫描排序的块数据读取出来
	{								//需要读取两层数据
		for(i=0;i<nTW;i++)			
		{
			for(j=nTW;j<2*nTW;j++)		//读取LH层信息
			{
				nIn[nCount][0]=i;		
				nIn[nCount][1]=j;
				nIn[nCount][2]=nLay;
				nIn[nCount][3]=nTemp[i][j];
				nCount++;
			}
		}
		nLay++;

⌨️ 快捷键说明

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