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

📄 watermark.cpp

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

		for(i=0;i<nNewHeight;i++)
		{
			for(j=0;j<nNewWidth;j++)
			{
				for(int q=0;q<3;q++)
				{
					*(pn3T+3*i*nNewWidth+j*3+q)=*(pnT+i*nNewWidth+j);
				}
			}
		}
	}
	else if( pDoc->m_nOriBitCount==24 )
	{
		pn3T=new int[(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth*3];
		
		for(int p=0;p<3;p++)
		{
			for(x=0;x<nSizePic;x++)
			{
				*(pnTemp+x)=*(pDoc->pnOriPic+x*3+p);
			}

			memcpy( pnT,pnTemp , sizeof(int)*nSizePic );
			
			for(i=0;i<nNewHeight;i++)
			{
				for(j=0;j<nNewWidth;j++)
				{
				
					*(pnTemp+i*nNewWidth+j)=*(pnT+i+(nNewWidth-1-j)*nNewHeight);
				}
			}
			for(x=0;x<nSizePic;x++)
			{
				*(pn3T+x*3+p)=*(pnTemp+x);
			}
		}
	}

	free(pnT);
	free(pnTemp);
//写入一个新的bmp文件
		
	BF.bfOffBits =54;
	BF.bfReserved1 =0;
	BF.bfReserved2 =0;
	BF.bfSize =int((nNewWidth + 3) / 4) * 4;
	BF.bfType =19778;

	BI.biBitCount =24;
	BI.biClrImportant =0;
	BI.biClrUsed =0;
	BI.biCompression =0;
	BI.biHeight =nNewHeight;
	BI.biPlanes =1;
	BI.biSize =40;
	BI.biSizeImage =0;
	BI.biWidth =nNewWidth;
	BI.biXPelsPerMeter =0;
	BI.biYPelsPerMeter =0;
		
	int nSizeWidth;
	nSizeWidth=int((nNewWidth*3+3)/4)*4 ;

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

	int l;
	int *pnTT;
	pnTT=pn3T;
		
	for(j=0;j<nNewHeight;j++){
		for(i=0;i<nNewWidth ;i++){
			for(l=0;l<3;l++){
				*lpTemp=(BYTE)*pn3T;
				lpTemp=lpTemp+1;
				pn3T=pn3T+1;
			}						//for l
		}							//for i
		if(((nNewWidth*3)%4)!=0){		//加入附加字节
			lpTemp=lpTemp+4-((nNewWidth*3)%4);
		}
	}
	pn3T=pnTT;
	free(pn3T);

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

	lpTemp=lpo;

//	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, nNewHeight*nSizeWidth );
	fOutFile.Close();
//	}

	free(lpTemp);
//	CDib dibTemp;

	fOutFile.Open(sFileName,CFile::modeRead);
//	fOutFile.Open(odlg.GetPathName(),CFile::modeRead);
	pDoc->m_dibOriPic.Read(&fOutFile);
	fOutFile.Close();
	Invalidate();
}

void CImageVisualView::OnGeoZoom() 
{
	// TODO: Add your command handler code here
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->m_boolFlag=FALSE;
	CDialogGeoZoom dlgGeoZoom;


	float fXZoomRatio=0.5,fYZoomRatio=0.5;

	dlgGeoZoom.m_fXZoom=fXZoomRatio;
	dlgGeoZoom.m_fYZoom=fYZoomRatio;

	if(dlgGeoZoom.DoModal()==IDOK)
	{
		fXZoomRatio=dlgGeoZoom.m_fXZoom;
		fYZoomRatio=dlgGeoZoom.m_fYZoom;
	}

	int i,j,x;	
	CFile fOutFile;
	int *pnTemp,*pnT;

	int nSizePic;

	int nNewWidth,nNewHeight;
	int *pn3T;

	BITMAPFILEHEADER BF;
	BITMAPINFOHEADER BI;
	BYTE *lpTemp;				//写入图像数据指针
	BYTE *lpo;
	int nOldWidth,nOldHeight;
	int nOldSizePic;

	nOldWidth=pDoc->m_nOriWidth;
	nOldHeight=pDoc->m_nOriHeight;

	nNewWidth=(int)((float)pDoc->m_nOriWidth*fXZoomRatio+0.5);
	nNewHeight=(int)((float)pDoc->m_nOriHeight*fYZoomRatio+0.5);

	nSizePic=nNewWidth*nNewHeight;
	nOldSizePic=pDoc->m_nOriHeight*pDoc->m_nOriWidth;
		
	pnTemp= new int [(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth];
	pnT=new int [(long)nNewHeight*(long)nNewWidth];

	if( pDoc->m_nOriBitCount== 8 )
	{
		memcpy( pnTemp,pDoc->pnOriPic , sizeof(int)*nOldSizePic );
		pn3T=new int[(long)nSizePic*3];
	
		for(i=0;i<nNewHeight;i++)
		{
			for(j=0;j<nNewWidth;j++)
			{
				*(pnT+i*nNewWidth+j)=*(pnTemp+(int)((float)i/fYZoomRatio)*nOldWidth+(int)((float)j/fXZoomRatio+0.5));
			}
		}

		for(i=0;i<nNewHeight;i++)
		{
			for(j=0;j<nNewWidth;j++)
			{
				for(int q=0;q<3;q++)
				{
					*(pn3T+3*i*nNewWidth+j*3+q)=*(pnT+i*nNewWidth+j);
				}
			}
		}
	}
	else if( pDoc->m_nOriBitCount==24 )
	{
		pn3T=new int[(long)nSizePic*3];
		
		for(int p=0;p<3;p++)
		{
			for(x=0;x<nOldSizePic;x++)
			{
				*(pnTemp+x)=*(pDoc->pnOriPic+x*3+p);
			}

			memcpy( pnT,pnTemp , sizeof(int)*nOldSizePic );
			
			for(i=0;i<nNewHeight;i++)
			{
				for(j=0;j<nNewWidth;j++)
				{
				
					*(pnTemp+i*nNewWidth+j)=*(pnT+(int)((float)i/fYZoomRatio+0.5)*nOldWidth+(int)((float)j/fXZoomRatio+0.5));
				}
			}
			for(x=0;x<nSizePic;x++)
			{
				*(pn3T+x*3+p)=*(pnTemp+x);
			}
		}
	}

	free(pnT);
	free(pnTemp);
//写入一个新的bmp文件
		
	BF.bfOffBits =54;
	BF.bfReserved1 =0;
	BF.bfReserved2 =0;
	BF.bfSize =int((nNewWidth + 3) / 4) * 4;
	BF.bfType =19778;

	BI.biBitCount =24;
	BI.biClrImportant =0;
	BI.biClrUsed =0;
	BI.biCompression =0;
	BI.biHeight =nNewHeight;
	BI.biPlanes =1;
	BI.biSize =40;
	BI.biSizeImage =0;
	BI.biWidth =nNewWidth;
	BI.biXPelsPerMeter =0;
	BI.biYPelsPerMeter =0;
		
	int nSizeWidth;
	nSizeWidth=int((nNewWidth*3+3)/4)*4 ;

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

	int l;
	int *pnTT;
	pnTT=pn3T;
		
	for(j=0;j<nNewHeight;j++){
		for(i=0;i<nNewWidth ;i++){
			for(l=0;l<3;l++){
				*lpTemp=(BYTE)*pn3T;
				lpTemp=lpTemp+1;
				pn3T=pn3T+1;
			}						//for l
		}							//for i
		if(((nNewWidth*3)%4)!=0){		//加入附加字节
			lpTemp=lpTemp+4-((nNewWidth*3)%4);
		}
	}
	pn3T=pnTT;
	free(pn3T);

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

	lpTemp=lpo;

//	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, nNewHeight*nSizeWidth );
	fOutFile.Close();
//	}

	free(lpTemp);
//	CDib dibTemp;

	fOutFile.Open(sFileName,CFile::modeRead);
//	fOutFile.Open(odlg.GetPathName(),CFile::modeRead);
	pDoc->m_dibOriPic.Read(&fOutFile);
	fOutFile.Close();
	Invalidate();
}

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

	int i,j;

	int Seedx=4534,Seedy=5323;
	int Nx=3535,Ny=4362;

	int nbit=2;
	int *pn;
	pn=pDoc->pnOriPic;
	int *nRecPoint;

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

	dlgWatermarkPatchWork.m_nBit=nbit;
	
	int bit=1;

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

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

	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;

	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 && m_nMarkBitCount==8)
	{
		for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
		{
			Tempw=*(nRecPoint+2*i);
			Temph=*(nRecPoint+2*i+1);
			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);
			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);
			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);
			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::OnRestoreBlurdib() 
{
	// TODO: Add your command handler code here
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	long i,j,l;
	long lgSizePicture;
	int *pn;
	BYTE *pb;

	lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
	
	int x,y;

	int nSumPic;
	int nClub=3;
	int nClub2;
	int i0,j0;
	i0=nClub/2;
	j0=nClub/2;
	
	nClub2=nClub*nClub;

	pb=pDoc->pbOriStatic;
	pn=pDoc->pnOriPic;
	int *pnTemp;


	if( pDoc->m_nOriBitCount== 8 )
	{
		pnTemp= new int [(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth];
		memcpy( pnTemp,pDoc->pnOriPic , sizeof(int)*lgSizePicture);
		
		for(i=i0;i<pDoc->m_nOriHeight-i0;i++)
		{
			for(j=j0;j<pDoc->m_nOriWidth-j0;j++)
			{
				nSumPic=0;
				for(x=-i0;x<=i0;x++)
				{
					for(y=-j0;y<=j0;y++)
					{
						nSumPic=nSumPic+*(pnTemp+(i+x)*pDoc->m_nOriWidth+(j+y));
					}
				}
				*(pn+(i)*pDoc->m_nOriWidth+(j))=(int)((float)nSumPic/(float)nClub2);
			}
		}

	}
	else if( pDoc->m_nOriBitCount==24 )
	{
		pnTemp= new int [(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth*3];
		memcpy( pnTemp,pDoc->pnOriPic , sizeof(int)*lgSizePicture*3 );
		for(int p=0;p<3;p++)
		{
			for(i=i0;i<pDoc->m_nOriHeight-i0;i++)
			{
				for(j=j0;j<pDoc->m_nOriWidth-j0;j++)
				{
					nSumPic=0;
					for(x=-i0;x<=i0;x++)
					{
						for(y=-j0;y<=j0;y++)
						{
							nSumPic=nSumPic+*(pnTemp+3*(i+x)*pDoc->m_nOriWidth+3*(j+y)+p);
						}
					}
					*(pn+(i)*pDoc->m_nOriWidth*3+(j)*3+p)=(int)((float)nSumPic/(float)nClub2);
					
				}
			}
		}

	}
	

⌨️ 快捷键说明

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