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

📄 数字水印技术doc.cpp

📁 基于变换域的信息隐藏技术
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		fp.Open((LPCTSTR)dlg.GetPathName(),CFile::modeWrite|CFile::modeCreate);
		fp.Read(str,m_size22.cx*m_size22.cy);
		fp.Close();
	}
	delete[]str;
}

void CDCTDoc::jiance()
{

   int i,j,l=0,k=0;
   
   static  double temp_data[256][256],*temp; 

   temp=(double*)malloc(256*256*sizeof(double));
    for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
			temp_data[i][j]=(water_marking[i][j]-picture[i][j])/(23.75*fabs(picture[i][j]));
    
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{  if( fabs(temp_data[i][j])>=0.1)
		      temp[l++]=temp_data[i][j];
           else;

		}               
   l=0;
   for(i=0;i<m_size22.cy;i++)
	   for(j=0;j<m_size22.cx;j++)
		   Datas22[i][j]=(float)temp[l++];

}

void CDCTDoc::OnHuiduPic() 
{
	// TODO: Add your command handler code here
	CFile fp;
	LPCTSTR lpfilename;
	CPIC_256_DLG pic;
	if(pic.DoModal()==IDOK)	
	{
		lpfilename=pic.m_spathname;
	}
	fp.Open(lpfilename,CFile::modeRead);
 	fp.Read((LPSTR)&bmh22,sizeof(BITMAPFILEHEADER));
 	if(bmh22.bfType!=0x4d42)
 	{
 		MessageBox(NULL,"不是合法的位图文件","错误!",MB_OK);

 		fp.Close();
		exit(-2);
	}
	
 		DWORD dwBitsSize=bmh22.bfSize;
 		lpbmi22=(BITMAPINFO*)GlobalAllocPtr(GHND,dwBitsSize-
			sizeof(BITMAPFILEHEADER));//分配内存单元
 		fp.Read(lpbmi22,dwBitsSize-sizeof(BITMAPFILEHEADER));
		if((lpbmi22->bmiHeader.biBitCount!=8)
			||(lpbmi22->bmiHeader.biCompression!=BI_RGB))
 		{
 			MessageBox(NULL,"not 256 or compresed","error",MB_OK);
 			GlobalFreePtr(lpbmi22);//释放内存单元
            lpbmi22=NULL;
 			fp.Close();//关闭文件
			exit(-2);
 		}
 	
	lpbits22=(LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER)+
		                                       256*sizeof(RGBQUAD);
 	m_size22.cx=lpbmi22->bmiHeader.biWidth;
	m_size22.cy=lpbmi22->bmiHeader.biHeight;
 	m_TrueWidth22=(m_size22.cx+3)/4*4;
 
	fp.Close();
    int i,j;
	for(i=0;i<m_size22.cy;i++)
		for(j=0;j<m_size22.cx;j++)
		{
			Datas22[i][j]=lpbits22[i * m_size22.cx+j];
			pic22[i][j]=lpbits22[i * m_size22.cx+j];
		}
	CString str;
	str.Format("该灰度图的大小为: %d ",m_size22.cx*m_size22.cy);
	AfxMessageBox(str);
	UpdateAllViews(NULL);
//	SetModifiedFlag();
	
    
    

	
}

void CDCTDoc::OnDraw22(CDC *pDC)
{

	::StretchDIBits(pDC->m_hDC,0,m_size.cy,
		m_size22.cx,m_size22.cy,
		0,0,m_size22.cx,
		m_size22.cy,lpbits22,lpbmi22,DIB_RGB_COLORS,SRCCOPY);
}

void CDCTDoc::OnNew256Pic() 
{
	// TODO: Add your command handler code here
	
	////////////////
	//功能:对新加入的 256 级灰度图像进行数据保存
	int i,j;
	for(i=0;i<m_size22.cy;i++)
		for(j=0;j<m_size22.cx;j++)
			Datas22[i][j]=lpbits22[i*m_size22.cx + j];

	
}

void CDCTDoc::OnDataW() 
{
	// TODO: Add your command handler code here
	int i;
	for(i=0;i<16*16-1;i++)
	{
		Water_SuiJi[i]=0;
	}
	CSUIJIDLG suiji;
	if(suiji.DoModal()==IDOK)
	{
		int p[16];
		int i,j,n=0;
		p[0]=suiji.m_d1;
		p[1]=suiji.m_d2;
		p[2]=suiji.m_d3;
		p[3]=suiji.m_d4;
		p[4]=suiji.m_d5;
		p[5]=suiji.m_d6;
		p[6]=suiji.m_d7;
		p[7]=suiji.m_d8;
        p[8]=suiji.m_d9;
		p[9]=suiji.m_d10;
		p[10]=suiji.m_d11;
		p[11]=suiji.m_d12;
		p[12]=suiji.m_d13;
		p[13]=suiji.m_d14;
		p[14]=suiji.m_d15;
		p[15]=suiji.m_d16;           
		for(i=0;i<16;i++)
			for(j=0;j<16;j++)
		{
			Water_SuiJi[i*16+j]=p[n];
			n++;
		}
	}
}

void CDCTDoc::OnS1() 
{
	// TODO: Add your command handler code here
	int i,j;
	w_mixture(Datas,Datas22);
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
			SetXY(i,j,(BYTE)Datas[i][j]);

	UpdateAllViews(NULL);

	SetModifiedFlag();
}

void CDCTDoc::w_mixture(float m_image[][800],float water[][256])
{
    int  n,m,i,j;
	double c_data=0.001;//m_size22.cx*m_size22.cy;
	CString str;

		for(i=0,m=0;(i<m_size22.cy)&&(m<m_size.cy);i++,m++)
			for(j=0,n=0;(j<m_size22.cx)&&(n<m_size.cx);j++,n++)
                 if(fabs(m_image[m][n])>10.0)//can.g_data)
					 m_image[m][n]=m_image[m][n]+
					      (float)(c_data*fabs(m_image[m][n]*water[i][j]));

	str.Format("水印大小为:%d ;\n嵌入的大小为:%d;\n 原图大小:%d。\n",m_size22.cx*m_size22.cy,(i-1)*m_size22.cx+(j-1),m_size.cx*m_size.cy);
	AfxMessageBox(str);
}

void CDCTDoc::OnDataPic() 
{
	// TODO: Add your command handler code here
    
	int i,j;
	AfxMessageBox("我们将要保存此时的水印信息 . . . .");
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			water_marking[i][j]=FDATA[i][j];
			water_data[i][j]=Datas[i][j];
		}

	AfxMessageBox("我们已经将此时的水印信息保存完毕!!");

	
}
void CDCTDoc::hvs2(float input[][800],float y_image[][800])
{
	int k,l,i,j,flag,ii,jj,x,y;
	float y_max;
    float  output[9][9],w_ydata[8][8],out_image[8][8];
    float  bcontrol[8][8];
	float *out_data=new float[64];
	float *point1=new float[64];
	float *point2=new float[64];
	k=0;
	l=0;
	flag=(int)sqrt((m_size.cx*m_size.cy/64));
    for(x=0;x<flag;x++)
		for(y=0;y<flag;y++)
		{
			point1=tiqu8_8(input,x*8,y*8);
			point2=tiqu8_8(y_image,x*8,y*8);
            for(ii=0;ii<8;ii++)
		        for(jj=0;jj<8;jj++)
				{
					output[ii][jj]=point1[ii*8+jj];
		            out_image[ii][jj]=point2[ii*8+jj];
				}
		
//生成亮度方差矩阵//		

	         for(i=0;i<8;i++)
		         for(j=0;j<8;j++)
				 {  
					 if(i==7)
                       output[i+1][j]=output[i][j];
		             else
                     if(j==7)
                       output[i][j+1]=output[i][j];       
			           w_ydata[i][j]=(output[i][j]*output[i][j]+output[i][j+1]*output[i][j+1]+output[i+1][j]*output[i+1][j]+output[i+1][j+1]*output[i+1][j+1])/4;
			     }
	         for(i=0;i<8;i++)
		         for(j=0;j<8;j++)
				 {
					 if(i==7)
                        output[i+1][j]=output[i][j];
		             else
                         if(j==7)
                               output[i][j+1]=output[i][j];       
			
			          w_ydata[i][j]=w_ydata[i][j]-(output[i][j]+output[i][j+1]+output[i+1][j]+output[i+1][j+1])*(output[i][j]+output[i][j+1]+output[i+1][j]+output[i+1][j+1])/16;
				 }
//求出亮度方差矩阵中的最大值//		
	
	         y_max=w_ydata[0][0];      
             for(i=0;i<8;i++)
		         for(j=0;j<8;j++)
                   if(w_ydata[i][j]>=y_max)                          
		               y_max=w_ydata[i][j];		   
       
//生成控制强度系数,并计算调整后的亮度值//		
                    	k=0;	 
	                    for(i=0;i<8;i++)
                            for(j=0;j<8;j++)
							{     
								bcontrol[i][j]=(float)sqrt(w_ydata[i][j]/y_max);
                                output[i][j]=out_image[i][j]+
				                (bcontrol[i][j]*(output[i][j]-out_image[i][j]));
  		                        out_data[k++]=output[i][j];
		 
							}
						  input8_8(Datas, out_data, x, y);
     
		}
	delete[]out_data;
}

void CDCTDoc::OnBeginH() 
{
	// TODO: Add your command handler code here
    hvs2(picture,Datas);
	UpdateAllViews(NULL);
	SetModifiedFlag();
}

void CDCTDoc::OnYuanPic() 
{
	// TODO: Add your command handler code here
	int i,j;
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			picture[i][j]=FDATA[i][j];
		}
	AfxMessageBox("信息已经保存");
}

float * CDCTDoc::tiqu8_8(float input[][800], int x, int y)
{
	int i,j;
	float *data_8_8=new float[8*8];
    for(i=0;i<8;i++)
       for(j=0;j<8;j++)
       data_8_8[i*8+j]=input[x+i][y+j];
	return data_8_8;
}

void CDCTDoc::input8_8(float yuan[][800], float *data_to, int x, int y)
{
	int i,j;
	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
		  yuan[i+x][j+y]=data_to[i*8+j];

}

void CDCTDoc::OnChushiPic() 
{
	// TODO: Add your command handler code here
	int i,j;
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			chushi[i][j]=Datas[i][j];
		}
	AfxMessageBox("图像的初始化值。");
	
}

void CDCTDoc::OnSubPW() 
{
	// TODO: Add your command handler code here
	int i,j;
	for(i=0;(i<m_size.cy);i++)
		for(j=0;(j<m_size.cx);j++)
		{
			Datas[i][j]=chushi[i][j]-Datas[i][j];
		}
	UpdateAllViews(NULL);
	SetModifiedFlag();
}

void CDCTDoc::OnTxtToBits() 
{
	// TODO: Add your command handler code here
	
}

void CDCTDoc::OnBitTxt() 
{
	// TODO: Add your command handler code here
	CFileDialog dlg(1,"txt","*.txt");
	CFile fp;
	int i,j;
	if(dlg.DoModal()==IDOK)
	{
		fp.Open((LPCTSTR)dlg.GetPathName(),CFile::modeRead);
	}
	char *str=new char[16*16];
	fp.Read(str,16*16);
	for(i=0;i<16;i++)
		for(j=0;j<16;j++)
	      txt[i][j]=(int)(str[i*16+j]-48);
	AfxMessageBox("文本信息已经获得为一个 16*16 的0~1矩阵");
	fp.Close();
	delete[]str;
	
}

void CDCTDoc::OnS4() 
{
	// TODO: Add your command handler code here
	CDLG_CONTROL can;
	int i,j,N=8,k1,k2;
 if(can.DoModal()==IDOK)
 {
	for(i=0;i<Nw/N;i++)
	{
		for(j=0;j<Nh/N;j++)
		{
			for(k1=0;k1<N;k1++)
			{
		        for(k2=0;k2<N;k2++)
				{
			      DataR[k1+i*N][k2+j*N] += can.m_fsuiji*txt[k1][k2];
		          Datas[k1+i*N][k2+j*N]=(float)fabs((pow(2,DataR[k1+i*N][k2+j*N])-1));
	           // DataR[k1+i*N][k2+j*N]=(float)(log10(1+fabs(Datas[k1+i*N][k2+j*N])));///log10(2));
				}
			
			}
			
		}
	}
 }
    for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
			SetXY(i,j,(BYTE)Datas[i][j]);
    UpdateAllViews(NULL);
	SetModifiedFlag();
	
}

void CDCTDoc::On2Pic() 
{
	// TODO: Add your command handler code here
	CFileDialog dlg(1,"BMP","*.bmp");
	CFile fp;
	if(dlg.DoModal()==IDOK)
	{
		fp.Open((LPCTSTR)dlg.GetPathName(),CFile::modeRead);
		fp.Read((LPSTR)&bmh33,sizeof(BITMAPFILEHEADER));
		if(bmh33.bfType!=0x4d42)
		{
 		MessageBox(NULL,"不是合法的位图文件","错误!",MB_OK);

 		fp.Close();
		exit(-2);
		}
	
 		DWORD dwBitsSize=bmh33.bfSize;
 		lpbmi33=(BITMAPINFO*)GlobalAllocPtr(GHND,dwBitsSize-
			sizeof(BITMAPFILEHEADER));//分配内存单元
 		fp.Read(lpbmi33,dwBitsSize-sizeof(BITMAPFILEHEADER));
		if((lpbmi33->bmiHeader.biBitCount!=1)
			||(lpbmi33->bmiHeader.biCompression!=BI_RGB))
 		{
 			MessageBox(NULL,"是被压缩过的或 不是二值图像  . . . .","error",MB_OK);
 			GlobalFreePtr(lpbmi33);//释放内存单元
            lpbmi33=NULL;
 			fp.Close();//关闭文件
 			exit(-2);
 		}
 	
	lpbits33=(LPBYTE)lpbmi33+sizeof(BITMAPINFOHEADER)+2*sizeof(RGBQUAD);
 	m_size33.cx=lpbmi33->bmiHeader.biWidth;
	m_size33.cy=lpbmi33->bmiHeader.biHeight;
	CString str;
	str.Format("%d",m_size33.cx*m_size33.cy);
	AfxMessageBox(str);
	 widthx=m_size33.cx/8;
      widthy=m_size33.cy/8;
	int temp;
	int i,j;
	for(i=0;i<widthy;i++)
		for(j=0;j<widthx;j++)
		{
			if(lpbits33[i*widthx+j]>0)
				temp=1;
			else
				temp=0;
			bits2[i][j]=temp;
		}

	fp.Close();
	return;
	}

	
}

void CDCTDoc::OnS5() 
{
	// TODO: Add your command handler code here
	int i,j;
	for(i=0;i<widthy;i++)
		for(j=0;j<widthx;j++)
		{
			Datas[i][j]+=bits2[i][j];
		}
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			SetXY(i,j,(BYTE)Datas[i][j]);
		}
	UpdateAllViews(NULL);
	SetModifiedFlag();

}

void CDCTDoc::OnWT() 
{
	// TODO: Add your command handler code here
	float *pick=new float[64];
	float *pick2=new float[64];
	int water[8][8];
	int i,j,t;	
	CString str;

	pick=take_m(picture,m_size.cx,8);
	pick2=take_m(water_marking,m_size.cx,8);
	int ok[64];
	float q;
	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
	str.Format("masksize[i][j]= %f ",masksize[i][j]);
	        AfxMessageBox(str);
	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
		{
		    
			str.Format("pick2[i*8+j]= %f ",pick2[i*8+j]);
	        AfxMessageBox(str);
			str.Format("pick[i*8+j]= %f ",pick[i*8+j]);
	        AfxMessageBox(str);
			
			str.Format("middle[i][j]= %f ",middle[i][j]);
	        AfxMessageBox(str);
			q=(pick2[i*8+j]-pick[i*8+j]-masksize[i][j])/(2*middle[i][j]);   
			if(q>50)
				water[i][j]=1;
			else 
				water[i][j]=0;
			
		}
    CString string;
	for(i=0;i<8;i++)
	{
		t=0;
	   for(j=0;j<=7;j++)
		{
			t = t + (int)pow(2,7-j)*water[i][j];
		   
		}
	    ok[i]=t;
		string.Format("我们获得的水印信息为\n第 %d 个为   %d",i+1,t);
		AfxMessageBox(string);

	}
	CFileDialog dlg(1,"txt","*.txt");
	CFile fp;
	if(dlg.DoModal()==IDOK)
	{
		fp.Open((LPCTSTR)dlg.GetPathName(),CFile::modeWrite|CFile::modeCreate);
		CString str("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
		for(i=0;i<8;i++)
		  str.SetAt(i,(int)ok[i]);
		fp.Write(str,str.GetLength());
		fp.Close();
	}
	delete[]pick;
	delete[]pick2;

	
}

void CDCTDoc::OnWT2() 
{
	// TODO: Add your command handler code here
   int water[16][16];
   int i,j;
   float q;	
   int arr[32],p,k=0;
   for(i=0;i<16;i++)
		for(j=0;j<16;j++)
		{
			//q=Datas[i][j]-picture[i][j];
			q=water_marking[i][j]-picture[i][j];
			if(q>0)water[i][j]=1;
			else 
				water[i][j]=0;
		}
	int t;
	for(i=0;i<16;i++)
	{
		t=0;
		p=7;
	   for(j=0;j<16;j++)
		{
			t = t + (int)pow(2,p)*water[i][j];
		    p--;
			if(p<0)
			{
				arr[k++]=t;
				p=7;
			}
		}
	    
	}
	CFileDialog dlg(1,"txt","*.txt");
	CFile fp;
	if(dlg.DoModal()==IDOK)
	{
		fp.Open((LPCTSTR)dlg.GetPathName(),CFile::modeWrite|CFile::modeCreate);
		CString str;
		char *string=new char[32];
		for(i=0;i<k-1;i++)
		   string[i]=arr[i];
		string[32]='\0';

		str=string;
		fp.Write(str,str.GetLength());
		fp.Close();
		delete[]string;
	}
}


void CDCTDoc::ji(float sum[][800], float yuan[][800], float jia[][800])
{
	int i,j,k;
	for(i=0;i<m_size.cx;i++)
	{
		for(j=0;j<m_size.cy;j++)
		{
			for(k=0;k<m_size.cx;k++)
				sum[i][j]+=yuan[j][k]*jia[k][j];
		}
	}
}

float CDCTDoc::sim(float a[][800], float b[][800],int n)
{
	float t1,t2;
    static float temp[800][800];
    static float temp2[800][800];

	ji(temp,a,b);
	ji(temp2,a,a);
	t1=hang(temp,n);
	t2=hang(temp2,n);
	return (float)(t1*1.0/t2);
}

float CDCTDoc::hang(float matrix[][800],int length)
{
	float *p=new float[length*length];
	int i,j;
	float temp;
    for(i=0;i<length;i++)
      for(j=0;j<length;j++)
	  {
		   p[i*length+j]=matrix[j][i];
	  }
	temp=0.0;
	for(i=0;i<length;i++)
		for(j=0;j<length;j++)
		{
			temp +=p[i*length+j]*p[j*length+i];
		}
	delete[]p;
	return temp;
}
void CDCTDoc::OnSimYanzheng() 
{
	// TODO: Add your command handler code here
	float t,f;
	//t=sim(chushi,water_marking,m_size.cx);
	t=sim(chushi,water_data,m_size.cx);
	f=(float)fabs(t-1)*100;
	CString str;
	str.Format("经检验,水印的相似度为:\n%.5f。\n误差为:%.2f%%",t,f);
	AfxMessageBox(str);
	
}

void CDCTDoc::OnYanzheng() 
{
	// TODO: Add your command handler code here
	float t,f;
	t=sim(chushi,pic22,m_size.cx);
	f=(float)fabs(t-1)*100;
	CString str;
	str.Format("经检验,水印的相似度为:\n%.5f。\n误差为:%.2f%%",t,f);
	AfxMessageBox(str);
	
}



void CDCTDoc::OnHelpdlg() 
{
	// TODO: Add your command handler code here
	CHELPDLG help;
	

⌨️ 快捷键说明

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