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

📄 watermark.cpp

📁 十分详细的基于Wavelet的图像水印嵌入程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	free(pnTemp);


	if(pDoc->m_nOriBitCount==24)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				for(l=0;l<3;l++){
					*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
					pDoc->pnOriPic=pDoc->pnOriPic+1;
					pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
				}						//for l
			}							//for i
			if(((pDoc->m_nOriWidth*3)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
			}
		}
	}else if(pDoc->m_nOriBitCount==8)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
				pDoc->pnOriPic=pDoc->pnOriPic+1;
				pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
			
			}							//for i
			if(((pDoc->m_nOriWidth)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
			}
		}
	}
	pDoc->pbOriStatic=pb;
	pDoc->pnOriPic=pn;
	Invalidate();	
}



void CImageVisualView::OnWatermarkPatchworkDraw() 
{
		// TODO: Add your command handler code here
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CDialogWatermarkPatchWork dlgWatermarkPatchWork;

	long i,j;

	int nbit=2;
	BITMAPFILEHEADER BF;
	BITMAPINFOHEADER BI;

	dlgWatermarkPatchWork.m_nBit=nbit;
	
	int bit=1;
	BYTE *pb;
	int *pn;
	int Seedx=4534,Seedy=5323;
	int Nx=3535,Ny=4362;
	
	int *nRecPoint;

	
	nRecPoint=new int[m_nMarkWidth*m_nMarkHeight*2];

	if(dlgWatermarkPatchWork.DoModal()==IDOK)
	{
		nbit=dlgWatermarkPatchWork.m_nBit;
	}

	for(i=0;i<nbit-1;i++)
	{
		bit=bit*2;
	}


	int nWaterMarkWidth=64,nWaterMarkHeight=64;

	int Lx,Ly;
	int w,h;

	w=pDoc->m_nOriWidth;
	h=pDoc->m_nOriHeight;

	Lx=(Seedx*Seedx)%Nx;
	Ly=(Seedy*Seedy)%Ny;

	*(nRecPoint)=(Lx%w);
	*(nRecPoint+1)=(Ly%h);

	int Tempw,Temph;
	BOOL blFlag;
	int count=1;

	BYTE *bDrawWatermark;
	
	bDrawWatermark=new BYTE[nWaterMarkWidth*nWaterMarkHeight];

	pb=pDoc->pbOriStatic;
	pn=pDoc->pnOriPic;

	while(count<m_nMarkWidth*m_nMarkHeight)
	{
		blFlag=TRUE;
		Lx=(Lx*Lx)%Nx;
		Ly=(Ly*Ly)%Ny;

		Tempw=(Lx%w);
		Temph=(Ly%h);
		
		for(j=0;j<count;j++)
		{
			if((Tempw==*(nRecPoint+2*j))&&(Temph==*(nRecPoint+2*j+1)))
			{
				blFlag=FALSE;
			}
			Lx=Lx+1;
			Ly=Ly+2;
		}
		if(blFlag)
		{
			*(nRecPoint+2*count)=Tempw;
			*(nRecPoint+2*count+1)=Temph;
			count++;
		}
	}/**/

	if(pDoc->m_nOriBitCount== 8 )
	{
		for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
		{
			Tempw=*(nRecPoint+2*i);
			Temph=*(nRecPoint+2*i+1);
			if((*(pn+Temph*w+Tempw)%(2*bit))>=bit)
			{
				*(bDrawWatermark+i)=255;
			}else
				*(bDrawWatermark+i)=0;
		}
	}else if(pDoc->m_nOriBitCount== 24)
	{
		for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
		{
			Tempw=*(nRecPoint+2*i);
			Temph=*(nRecPoint+2*i+1);
			if((*(pn+Temph*w*3+Tempw*3)%(2*bit))>=bit)
			{
				*(bDrawWatermark+i)=255;
			}else
				*(bDrawWatermark+i)=0;
		}
	}


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

	BI.biBitCount =24;
	BI.biClrImportant =0;
	BI.biClrUsed =0;
	BI.biCompression =0;
	BI.biHeight =nWaterMarkHeight;
	BI.biPlanes =1;
	BI.biSize =40;
	BI.biSizeImage =0;
	BI.biWidth =nWaterMarkWidth;
	BI.biXPelsPerMeter =0;
	BI.biYPelsPerMeter =0;
		
	int nSizeWidth;
	nSizeWidth=int((nWaterMarkWidth*3+3)/4)*4 ;
	BYTE *lpTemp,*lpo,*lpD;

	lpTemp = (BYTE *)calloc( nSizeWidth *nWaterMarkHeight, sizeof( BYTE ));
	lpo=lpTemp;

	lpD=bDrawWatermark;
	int l;
	
	for(j=0;j<nWaterMarkHeight;j++){
		for(i=0;i<nWaterMarkWidth ;i++){
			for(l=0;l<3;l++){
				*(lpTemp)=*(bDrawWatermark);
				lpTemp=lpTemp+1;
			}
			bDrawWatermark++;					//for l
		}							//for i
		if(((nWaterMarkWidth*3)%4)!=0){		//加入附加字节
			lpTemp=lpTemp+4-((nWaterMarkWidth*3)%4);
		}
	}
	bDrawWatermark=lpD;


	CFileDialog odlg(FALSE,"bmp","*.bmp");	//显示写入图像的文件

	lpTemp=lpo;
	CFile fOutFile;

//	if(odlg.DoModal()==IDOK){

	CString sFileName="c:\\temp.bmp";
//		fOutFile.Open (odlg.GetPathName(),CFile::modeCreate | CFile::modeWrite );
		fOutFile.Open (sFileName,CFile::modeCreate | CFile::modeWrite );
		fOutFile.Write((LPVOID) &BF, sizeof(BITMAPFILEHEADER));
		fOutFile.Write((LPVOID) &BI,  sizeof(BITMAPINFOHEADER));
		fOutFile.Write ((LPVOID) lpTemp, nWaterMarkHeight*nSizeWidth );
		fOutFile.Close();
//	}

/*	CClientDC dlgDC(this);
	for(i=0;i<nWaterMarkHeight;i++)
	{
		for(j=0;j<nWaterMarkWidth;j++)
		{

			dlgDC.SetPixel(pDoc->m_nOriWidth+j,nWaterMarkHeight+nWaterMarkHeight-i-1,RGB(*(bDrawWatermark+nWaterMarkWidth*i+j),*(bDrawWatermark+i*nWaterMarkWidth+j),*(bDrawWatermark+i*nWaterMarkWidth+j)));
		}
	}*/
	free(bDrawWatermark);
	free(lpTemp);

	fOutFile.Open(sFileName,CFile::modeRead);
//	fOutFile.Open(odlg.GetPathName(),CFile::modeRead);
	m_dibDrawMark.Read(&fOutFile);
	fOutFile.Close();
	blDrawMark=TRUE;
	free(nRecPoint);
	Invalidate();


}

void CImageVisualView::OnWatermarkHashOneway() 
{
	
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	int i,j;

	int Seedx=4534,Seedy=5323,Seedl=3415;
	int Nx=3535,Ny=4362,Nl=3551;
	int t;
	int *pn;
	pn=pDoc->pnOriPic;
	int *nRecPoint;

	nRecPoint=new int[m_nMarkWidth*m_nMarkHeight*3];

	int bit=1;


//	for(i=0;i<nbit-1;i++)
//	{
//		bit=bit*2;
//	}

	int Lx,Ly,Ll;
	int w,h,L;

	w=pDoc->m_nOriWidth;
	h=pDoc->m_nOriHeight;
	L=8;

	Lx=(Seedx*Seedx)%Nx;
	Ly=(Seedy*Seedy)%Ny;
	Ll=(Seedl*Seedl)%Nl;

	*(nRecPoint)=(Lx%w);
	*(nRecPoint+1)=(Ly%h);
	*(nRecPoint+2)=(Ll%L);

	int Tempw,Temph,TempL;
	BOOL blFlag;
	int count=1;

	while(count<m_nMarkWidth*m_nMarkHeight)
	{
		blFlag=TRUE;
		Lx=(Lx*Lx)%Nx;
		Ly=(Ly*Ly)%Ny;
		Ll=(Ll*Ll)%Nl;

		Tempw=(Lx%w);
		Temph=(Ly%h);
		TempL=(Ll%L);
		
		if(TempL==0||TempL==7)
		{
			blFlag=FALSE;
		}

		for(j=0;j<count;j++)
		{		
			if((Tempw==*(nRecPoint+2*j))&&(Temph==*(nRecPoint+2*j+1)))
			{
				blFlag=FALSE;
			}
			Lx=Lx+1;
			Ly=Ly+2;
			Ll=Ll+Lx-Ly;
		}

		if(blFlag)
		{
			*(nRecPoint+2*count)=Tempw;
			*(nRecPoint+2*count+1)=Temph;
			*(nRecPoint+2*count+2)=TempL;
			count++;
		}
	}

	if(pDoc->m_nOriBitCount== 8 && m_nMarkBitCount==8)
	{
		for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
		{
			Tempw=*(nRecPoint+2*i);
			Temph=*(nRecPoint+2*i+1);
			TempL=*(nRecPoint+2*count+2);
			
			for(t=0;t<TempL;t++)
			{
				bit=bit*2;
			}

			if(*(pnMarkPic+i)>128)//嵌入1/
			{
				if((*(pn+Temph*w+Tempw)%(2*bit))<bit)
				{
					*(pn+Temph*w+Tempw)=*(pn+Temph*w+Tempw)+bit;
				}
			}else if(*(pnMarkPic+i)<=128)
			{
				if((*(pn+Temph*w+Tempw)%(2*bit))>=bit)
				{
					*(pn+Temph*w+Tempw)=*(pn+Temph*w+Tempw)-bit;
				}
			}
		}
	}else if(pDoc->m_nOriBitCount== 8 && m_nMarkBitCount==24)
	{
		for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
		{
			Tempw=*(nRecPoint+2*i);
			Temph=*(nRecPoint+2*i+1);
			TempL=*(nRecPoint+2*count+2);
			
			for(t=0;t<TempL;t++)
			{
				bit=bit*2;
			}
			if(*(pnMarkPic+3*i)>128)//嵌入1/
			{
				if((*(pn+Temph*w+Tempw)%(2*bit))<bit)
				{
					*(pn+Temph*w+Tempw)=*(pn+Temph*w+Tempw)+bit;
				}
			}else if(*(pnMarkPic+3*i)<=128)
			{
				if((*(pn+Temph*w+Tempw)%(2*bit))>=bit)
				{
					*(pn+Temph*w+Tempw)=*(pn+Temph*w+Tempw)-bit;
				}
			}
		}
	}else if(pDoc->m_nOriBitCount== 24 && m_nMarkBitCount==8)
	{
		for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
		{
			Tempw=*(nRecPoint+2*i);
			Temph=*(nRecPoint+2*i+1);
			TempL=*(nRecPoint+2*count+2);
			
			for(t=0;t<TempL;t++)
			{
				bit=bit*2;
			}
			if(*(pnMarkPic+i)>128)//嵌入1/
			{
				if((*(pn+Temph*w*3+Tempw*3)%(2*bit))<bit)
				{
					*(pn+Temph*w*3+Tempw*3)=*(pn+Temph*w*3+Tempw*3)+bit;
				}
			}else if(*(pnMarkPic+i)<=128)
			{
				if((*(pn+Temph*w*3+Tempw*3)%(2*bit))>=bit)
				{
					*(pn+Temph*w*3+Tempw*3)=*(pn+Temph*w*3+Tempw*3)-bit;
				}
			}
		}
	}else if(pDoc->m_nOriBitCount== 24 && m_nMarkBitCount==24)
	{
		for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
		{
			Tempw=*(nRecPoint+2*i);
			Temph=*(nRecPoint+2*i+1);
			TempL=*(nRecPoint+2*count+2);
			
			for(t=0;t<TempL;t++)
			{
				bit=bit*2;
			}
			if(*(pnMarkPic+i*3)>128)//嵌入1/
			{
				if((*(pn+Temph*w*3+Tempw*3)%(2*bit))<bit)
				{
					*(pn+Temph*w*3+Tempw*3)=*(pn+Temph*w*3+Tempw*3)+bit;
				}
			}else if(*(pnMarkPic+i*3)<=128)
			{
				if((*(pn+Temph*w*3+Tempw*3)%(2*bit))>=bit)
				{
					*(pn+Temph*w*3+Tempw*3)=*(pn+Temph*w*3+Tempw*3)-bit;
				}
			}
		}
	}

	BYTE *pb;
	int l;

	pb=pDoc->pbOriStatic;
	pn=pDoc->pnOriPic;

	if(pDoc->m_nOriBitCount==24)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				for(l=0;l<3;l++){
					*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
					pDoc->pnOriPic=pDoc->pnOriPic+1;
					pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
				}						//for l
			}							//for i
			if(((pDoc->m_nOriWidth*3)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
			}
		}
	}else if(pDoc->m_nOriBitCount==8)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
				pDoc->pnOriPic=pDoc->pnOriPic+1;
				pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
			
			}							//for i
			if(((pDoc->m_nOriWidth)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
			}
		}
	}
	pDoc->pbOriStatic=pb;
	pDoc->pnOriPic=pn;
	free(nRecPoint);
	Invalidate();	
}

void CImageVisualView::OnWatermarkDrawHash() 
{
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	int i,j;
	int nWaterMarkWidth=64,nWaterMarkHeight=64;


	BITMAPFILEHEADER BF;
	BITMAPINFOHEADER BI;
	
	int Seedx=4534,Seedy=5323,Seedl=3415;
	int Nx=3535,Ny=4362,Nl=3551;
	int t;
	int *pn;
	pn=pDoc->pnOriPic;
	int *nRecPoint;

	nRecPoint=new int[nWaterMarkWidth*nWaterMarkHeight*3];

	int bit=1;


//	for(i=0;i<nbit-1;i++)
//	{
//		bit=bit*2;
//	}
	BYTE *bDrawWatermark;
	
	bDrawWatermark=new BYTE[nWaterMarkWidth*nWaterMarkHeight];


	int Lx,Ly,Ll;
	int w,h,L;

	w=pDoc->m_nOriWidth;
	h=pDoc->m_nOriHeight;
	L=8;

	Lx=(Seedx*Seedx)%Nx;
	Ly=(Seedy*Seedy)%Ny;
	Ll=(Seedl*Seedl)%Nl;

	*(nRecPoint)=(Lx%w);
	*(nRecPoint+1)=(Ly%h);
	*(nRecPoint+2)=(Ll%L);

	int Tempw,Temph,TempL;
	BOOL blFlag;
	int count=1;

	BYTE *pb;

	pb=pDoc->pbOriStatic;
	pn=pDoc->pnOriPic;

	while(count<nWaterMarkWidth*nWaterMarkHeight)
	{
		blFlag=TRUE;
		Lx=(Lx*Lx)%Nx;
		Ly=(Ly*Ly)%Ny;
		Ll=(Ll*Ll)%Nl;

		Tempw=(Lx%w);
		Temph=(Ly%h);
		TempL=(Ll%L);
		
		if(TempL==0||TempL==7)
		{
			blFlag=FALSE;
		}
		for(j=0;j<count;j++)
		{		
			if((Tempw==*(nRecPoint+2*j))&&(Temph==*(nRecPoint+2*j+1)))
			{
				blFlag=FALSE;
			}
			Lx=Lx+1;
			Ly=Ly+2;
			Ll=Ll+Lx-Ly;
		}
		
		if(blFlag)
		{
			*(nRecPoint+2*count)=Tempw;
			*(nRecPoint+2*count+1)=Temph;
			*(nRecPoint+2*count+2)=TempL;
			count++;
		}
	}

	if(pDoc->m_nOriBitCount== 8 )
	{
		for(i=0;i<nWaterMar

⌨️ 快捷键说明

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