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

📄 dctwaterview.cpp

📁 站长!这是DCT域的图像数字水印嵌入及提取程序!请查收!暂归入加密解密类别!
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        ////Change to bmp style to display starts//////////
        LPBITMAPFILEHEADER bitfile1;
        LPBITMAPINFOHEADER bitinfo1;
        bitfile1=(LPBITMAPFILEHEADER)pDoc->m_StandardBmpInfo;
        bitinfo1=(LPBITMAPINFOHEADER)(pDoc->m_StandardBmpInfo+sizeof(BITMAPFILEHEADER));
        bitfile1->bfSize=pDoc->m_OriginalImageSize+1078;
        bitinfo1->biHeight=pDoc->m_OriginalImageHeight;
        bitinfo1->biWidth=pDoc->m_OriginalImageWidth;
        //Copy the 256 gray bmp image header information
        memcpy(pDoc->m_DisplayImageBytes1,pDoc->m_StandardBmpInfo,1078);
        for(i=0;i<pDoc->m_OriginalImageHeight;i++)
          memcpy(pDoc->m_DisplayImageBytes1+1078+i*pDoc->m_OriginalImageWidth,pDoc->m_EmbededImageBytes+(pDoc->m_OriginalImageHeight-i-1)*pDoc->m_OriginalImageWidth,pDoc->m_OriginalImageWidth);
        ////Change to bmp style to display ends//////////
        pDoc->m_Embeded0=TRUE;
        Invalidate(FALSE);
	    break;
        case 2:
    	//Subsample the Original Image
    	for(i=0;i<256;i++)
		{
    	  for(j=0;j<256;j++)
		  {
	        pDoc->m_OriginalImageBytes1[j+256*i]=pDoc->m_OriginalImageBytes[2*j+2*i*512];
		    pDoc->m_OriginalImageBytes2[j+256*i]=pDoc->m_OriginalImageBytes[2*j+1+2*i*512];
		    pDoc->m_OriginalImageBytes3[j+256*i]=pDoc->m_OriginalImageBytes[2*j+(2*i+1)*512];
		    pDoc->m_OriginalImageBytes4[j+256*i]=pDoc->m_OriginalImageBytes[2*j+1+(2*i+1)*512];
		  }
		}
        ////Change to bmp style to display starts//////////
        //Display the Subsampled Image
        LPBITMAPFILEHEADER bitfile3;
        LPBITMAPINFOHEADER bitinfo3;
        bitfile3=(LPBITMAPFILEHEADER)pDoc->m_StandardBmpInfo;
        bitinfo3=(LPBITMAPINFOHEADER)(pDoc->m_StandardBmpInfo+sizeof(BITMAPFILEHEADER));
        bitfile3->bfSize=256*256+1078;
        bitinfo3->biHeight=256;
        bitinfo3->biWidth=256;
        //Copy the 256 gray bmp image header information
        memcpy(pDoc->m_DisplayImageBytes11,pDoc->m_StandardBmpInfo,1078);
        memcpy(pDoc->m_DisplayImageBytes12,pDoc->m_StandardBmpInfo,1078);
        memcpy(pDoc->m_DisplayImageBytes13,pDoc->m_StandardBmpInfo,1078);
        memcpy(pDoc->m_DisplayImageBytes14,pDoc->m_StandardBmpInfo,1078);
        for(i=0;i<256;i++)
          memcpy(pDoc->m_DisplayImageBytes11+1078+i*256,pDoc->m_OriginalImageBytes1+(256-i-1)*256,256);
        pDoc->m_Subsampled1=TRUE;
        for(i=0;i<256;i++)
          memcpy(pDoc->m_DisplayImageBytes12+1078+i*256,pDoc->m_OriginalImageBytes2+(256-i-1)*256,256);
        pDoc->m_Subsampled2=TRUE;
        for(i=0;i<256;i++)
          memcpy(pDoc->m_DisplayImageBytes13+1078+i*256,pDoc->m_OriginalImageBytes3+(256-i-1)*256,256);
        pDoc->m_Subsampled3=TRUE;
        for(i=0;i<256;i++)
          memcpy(pDoc->m_DisplayImageBytes14+1078+i*256,pDoc->m_OriginalImageBytes4+(256-i-1)*256,256);
        pDoc->m_Subsampled4=TRUE;
        Invalidate(FALSE);
        //Display end
        //Get the required parameters
	    dimension=64;
	    blocks=256*256/dimension;
        wmblocks=32*32;
	    blockwidth=8;
	    blockheight=8;
	    //Judge the image size and width
	    wb=256/blockwidth;
	    hb=256/blockheight;
	    wmblockheight=128/hb;
	    wmblockwidth=128/wb;
	    //Apply memory
	    hMem=NULL;
	    hMem=GlobalAlloc(GMEM_FIXED,2*4*blocks*dimension+blocks*16*2);
	    if(hMem==NULL)
		{
	      sprintf(temp,"Sorry,Not Enough Memory %f Bytes,Unable To Embed!",(double)(MAXIMAGESIZE)/1024.0/1024.0);
	      MessageBox(temp,"Embed",MB_ICONSTOP|MB_OK);
	      return;
		}
	    //Alloc the memory
 	    for(p=0;p<blocks;p++)
		{
	      SourceVector1[p]=(unsigned char *)hMem+p*dimension;
	      SourceVector2[p]=(unsigned char *)hMem+p*dimension+blocks*dimension;
	      SourceVector3[p]=(unsigned char *)hMem+p*dimension+blocks*2*dimension;
	      SourceVector4[p]=(unsigned char *)hMem+p*dimension+blocks*3*dimension;
		}
	    for(q=0;q<blocks;q++)
		{
		  WmSourceVector1[q]=(unsigned char *)hMem+4*blocks*dimension+q*16;
	      WmSourceVector2[q]=(unsigned char *)hMem+4*blocks*dimension+q*16+blocks*16;
		}
		for(p=0;p<blocks;p++)
		{
	      TerminalVector1[p]=(unsigned char *)hMem+2*blocks*16+blocks*dimension*4+p*dimension;
	      TerminalVector2[p]=(unsigned char *)hMem+2*blocks*16+blocks*dimension*4+p*dimension+blocks*dimension;
	      TerminalVector3[p]=(unsigned char *)hMem+2*blocks*16+blocks*dimension*4+p*dimension+blocks*2*dimension;
	      TerminalVector4[p]=(unsigned char *)hMem+2*blocks*16+blocks*dimension*4+p*dimension+blocks*3*dimension;
		}
 	    //block the source image
	    for(l=0;l<hb;l++)
          for(k=0;k<wb;k++)
	  	    for(j=0;j<blockheight;j++)		
		      for(i=0;i<blockwidth;i++)		  
			  {
				SourceVector1[k+l*wb][i+j*blockwidth]=pDoc->m_OriginalImageBytes1[i+k*blockwidth+(j+l*blockheight)*256];
			    SourceVector2[k+l*wb][i+j*blockwidth]=pDoc->m_OriginalImageBytes2[i+k*blockwidth+(j+l*blockheight)*256];
			    SourceVector3[k+l*wb][i+j*blockwidth]=pDoc->m_OriginalImageBytes3[i+k*blockwidth+(j+l*blockheight)*256];
			    SourceVector4[k+l*wb][i+j*blockwidth]=pDoc->m_OriginalImageBytes4[i+k*blockwidth+(j+l*blockheight)*256];
			  }
	    for(l=0;l<hb;l++)
          for(k=0;k<wb;k++)
	  	    for(j=0;j<wmblockheight;j++)		
		      for(i=0;i<wmblockwidth;i++)		  
			  {
				WmSourceVector1[k+l*wb][i+j*wmblockwidth]=pDoc->m_PermutedWatermark[i+k*wmblockwidth+(j+l*wmblockheight)*128];
	            WmSourceVector2[k+l*wb][i+j*wmblockwidth]=pDoc->m_PermutedWatermark1[i+k*wmblockwidth+(j+l*wmblockheight)*128];
			  }
	    //DisplayIcon
	    SetCursor(LoadCursor(NULL, IDC_WAIT));
		//Embed
        pDoc->watermethod.Subsamplingmethod(blocks,blockwidth,blockheight,wb,hb,SourceVector1,SourceVector2,SourceVector3,SourceVector4,WmSourceVector1,WmSourceVector2,TerminalVector1,TerminalVector2,TerminalVector3,TerminalVector4,2);
        //Transmit the image information
	    for(l=0;l<hb;l++)
          for(k=0;k<wb;k++)
	  	    for(j=0;j<blockheight;j++)		
		      for(i=0;i<blockwidth;i++)		  
			  {
		        pDoc->m_EmbededImageBytes1[i+k*blockwidth+(j+l*blockheight)*256]=TerminalVector1[k+l*wb][i+j*blockwidth];
			    pDoc->m_EmbededImageBytes2[i+k*blockwidth+(j+l*blockheight)*256]=TerminalVector2[k+l*wb][i+j*blockwidth];
			    pDoc->m_EmbededImageBytes3[i+k*blockwidth+(j+l*blockheight)*256]=TerminalVector3[k+l*wb][i+j*blockwidth];
			    pDoc->m_EmbededImageBytes4[i+k*blockwidth+(j+l*blockheight)*256]=TerminalVector4[k+l*wb][i+j*blockwidth];
			  }
		//Compose the Embeded Image
	    for(i=0;i<256;i++)
	      for(j=0;j<256;j++)
		  {
		     pDoc->m_EmbededImageBytes[2*j+2*i*512]=pDoc->m_EmbededImageBytes1[j+256*i];
		     pDoc->m_EmbededImageBytes[2*j+1+2*i*512]=pDoc->m_EmbededImageBytes2[j+256*i];
		     pDoc->m_EmbededImageBytes[2*j+(2*i+1)*512]=pDoc->m_EmbededImageBytes3[j+256*i];
		     pDoc->m_EmbededImageBytes[2*j+1+(2*i+1)*512]=pDoc->m_EmbededImageBytes4[j+256*i];
		  }
        SetCursor(LoadCursor(NULL,IDC_ARROW));
        GlobalFree(hMem);
        ////Change to bmp style to display starts//////////
        LPBITMAPFILEHEADER bitfile4;
        LPBITMAPINFOHEADER bitinfo4;
        bitfile4=(LPBITMAPFILEHEADER)pDoc->m_StandardBmpInfo;
        bitinfo4=(LPBITMAPINFOHEADER)(pDoc->m_StandardBmpInfo+sizeof(BITMAPFILEHEADER));
        bitfile4->bfSize=pDoc->m_OriginalImageSize+1078;
        bitinfo4->biHeight=pDoc->m_OriginalImageHeight;
        bitinfo4->biWidth=pDoc->m_OriginalImageWidth;
        //Copy the 256 gray bmp image header information
        memcpy(pDoc->m_DisplayImageBytes1,pDoc->m_StandardBmpInfo,1078);
        for(i=0;i<pDoc->m_OriginalImageHeight;i++)
           memcpy(pDoc->m_DisplayImageBytes1+1078+i*pDoc->m_OriginalImageWidth,pDoc->m_EmbededImageBytes+(pDoc->m_OriginalImageHeight-i-1)*pDoc->m_OriginalImageWidth,pDoc->m_OriginalImageWidth);
        ////Change to bmp style to display ends//////////
        pDoc->m_Embeded1=TRUE;
        Invalidate(FALSE);	  
	  break;
    case 3:
	  
	  break;
    case 4:
	  
	  break;
    case 5:
	  
	  break;
    default:
	  break;
   }
   //test parameters
   int n;
   double psnrtemp;
   psnrtemp=0.0;
   for(n=0; n<MAXIMAGESIZE; n++)
   {
     psnrtemp=psnrtemp+fabs((pDoc->m_OriginalImageBytes[n]-pDoc->m_EmbededImageBytes[n])*(pDoc->m_OriginalImageBytes[n]-pDoc->m_EmbededImageBytes[n]));
   }
   pDoc->m_EmbededPSNR=10*log10(255.0*255.0*512*512/psnrtemp);
   pDoc->m_EmbededMSE=psnrtemp/512/512;
}

void CDCTWaterView::OnExtractExtract() 
{
	// TODO: Add your command handler code here
	CDCTWaterDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	//The memory handle
	HGLOBAL hMem;
    //The temp string
    char temp[256];
	long int i,j;
	unsigned long int p;
    unsigned short int blockwidth,blockheight,width,dimension,height,hb,wb,wmblockheight,wmblockwidth;
	unsigned long int blocks;
	unsigned char pp1[16384];
	unsigned char *pp11[MAXENCODEVECTORS/4];
	unsigned char pp2[16384];
	unsigned char *pp22[MAXENCODEVECTORS/4];
	unsigned char pp0[MAXENCODEVECTORS/4];
	unsigned char *pp01[MAXENCODEVECTORS/4];

    unsigned char tempbyte[2048];
	//The pointer for Encode image vectors
	unsigned char *SourceVector[MAXENCODEVECTORS];
	unsigned char *TerminalVector[MAXENCODEVECTORS];
 	unsigned char *SourceVector1[MAXENCODEVECTORS/4];
	unsigned char *SourceVector2[MAXENCODEVECTORS/4];
	unsigned char *SourceVector3[MAXENCODEVECTORS/4];
	unsigned char *SourceVector4[MAXENCODEVECTORS/4];
    int l,k;
    switch(pDoc->m_EmbedMethod)
	{
      case 0:
   	    //Get the required parameters
    	dimension=64;
    	blocks=512*512/dimension;
	    blockwidth=8;
	    blockheight=8;
    	//Judge the image size and width
    	wb=512/blockwidth;
	    hb=512/blockheight;
	    wmblockheight=128/hb;
	    wmblockwidth=128/wb;
	    //Apply memory
	    hMem=NULL;
	    hMem=GlobalAlloc(GMEM_FIXED,2*blocks*dimension+blocks*4);
	    if(hMem==NULL)
		{
	      sprintf(temp,"Sorry,Not Enough Memory %fm Bytes,Can Not Embed!",(double)(MAXIMAGESIZE)/1024.0/1024.0);
	      MessageBox(temp,"Embed",MB_ICONSTOP|MB_OK);
	      return;
		}
	    //Alloc the memory
 	    for(p=0;p<blocks;p++)
	        SourceVector[p]=(unsigned char *)hMem+p*dimension;
 	    for(p=0;p<blocks;p++)
	        pp01[p]=(unsigned char *)hMem+blocks*dimension+p*4;
 	    for(p=0;p<blocks;p++)
            TerminalVector[p]=(unsigned char *)hMem+blocks*dimension+p*dimension+blocks*4;
	    //block the source image
	    for(l=0;l<hb;l++)
          for(k=0;k<wb;k++)
	  	    for(j=0;j<blockheight;j++)		
		      for(i=0;i<blockwidth;i++)		  
	             SourceVector[k+l*wb][i+j*blockwidth]=pDoc->m_OriginalImageBytes[i+k*blockwidth+(j+l*blockheight)*512];
        for(l=0;l<hb;l++)
          for(k=0;k<wb;k++)
	  	    for(j=0;j<blockheight;j++)		
		      for(i=0;i<blockwidth;i++)		  
 	             TerminalVector[k+l*wb][i+j*blockwidth]=pDoc->m_EmbededImageBytes[i+k*blockwidth+(j+l*blockheight)*512];
   	   pDoc->watermethod.AddBasedExtract(blocks,blockwidth,blockheight,wb,hb,SourceVector,pp01,TerminalVector,pDoc->key1,pDoc->key2);
	   for(l=0;l<hb;l++)
         for(k=0;k<wb;k++)
	  	   for(j=0;j<wmblockheight;j++)		
		     for(i=0;i<wmblockwidth;i++)		  
			 {
			    pDoc->m_ExtractedWatermark[i+k*wmblockwidth+(j+l*wmblockheight)*128]=pp01[k+l*wb][i+j*wmblockwidth];
			 }
	   pDoc->watermethod.ReversePermuted(pDoc->m_ExtractedWatermark,pp0,pDoc->keyA,16384);
       pDoc->watermethod.ByteComposition(pp0,tempbyte,2048);
       memcpy(pDoc->m_ExtractedWatermarkBytes,pDoc->m_OriginalWatermarkBytes,62);
   	  memcpy(pDoc->m_ExtractedWatermark,pp0,16384);
       for(j=0;j<128;j++)
         for(i=0;i<16;i++)
           pDoc->m_ExtractedWatermarkBytes[62+i+(127-j)*16]=tempbyte[i+j*16];
      pDoc->m_Extracted=TRUE;	
	   GlobalFree(hMem);
	   break;
	  case 1:
    	blockwidth=8;
	    blockheight=8;
	    dimension=blockwidth*blockheight;
	    width=512;
	    height=512;
	    hb=height/blockheight/2;
	    wb=width/blockwidth/2;
	    blocks=512*512/blockwidth/blockheight/4;
	    wmblockheight=4;
	    wmblockwidth=4;
		//Apply memory
    	hMem=NULL;
	    hMem=GlobalAlloc(GMEM_FIXED,4*blocks*dimension+blocks*16*2);
	
	    if(hMem==NULL)
		{
	       sprintf(temp,"Sorry,Not Enough Memory %fMBytes,Failed to Embed!",(double)(MAXIMAGESIZE)/1024.0/1024.0);
	       MessageBox(temp,"Embed",MB_ICONSTOP|MB_OK);
	       return;
		}
	   //Alloc the memory
    	for(p=0;p<blocks;p++)
		{
	       SourceVector1[p]=(unsigned char *)hMem+p*dimension;
	       SourceVector2[p]=(unsigned char *)hMem+p*dimension+blocks*dimension;
	       SourceVector3[p]=(unsigned char *)hMem+p*dimension+blocks*2*dimension;
	       SourceVector4[p]=(unsigned char *)hMem+p*dimension+blocks*3*dimension;
		}
	    for(p=0;p<blocks;p++)
		{
		   pp11[p]=(unsigned char *)hMem+4*blocks*dimension+p*16;
   	       pp22[p]=(unsigned char *)hMem+4*blocks*dimension+p*16+blocks*16;
		}
		//Transmit the image information
	  for(l=0;l<hb;l++)
       for(k=0;k<wb;k++)
	  	for(j=0;j<blockheight;j++)		
		  for(i=0;i<blockwidth;i++)		  
		  {
	    	  SourceVector1[k+l*wb][i+j*blockwidth]=pDoc->m_EmbededImageBytes1[i+k*blockwidth+(j+l*blockheight)*256];
			  SourceVector2[k+l*wb][i+j*blockwidth]=pDoc->m_EmbededImageBytes2[i+k*blockwidth+(j+l*blockheight)*256];
			  SourceVector3[k+l*wb][i+j*blockwidth]=pDoc->m_EmbededImageBytes3[i+k*blockwidth+(j+l*blockheight)*256];
			  SourceVector4[k+l*wb][i+j*blockwidth]=pDoc->m_EmbededImageBytes4[i+k*blockwidth+(j+l*blockheight)*256];
		  }
	  pDoc->watermethod.ExtractSubsamplingmethod(blocks,blockwidth,blockheight,wb,hb,wmblockheight,wmblockwidth,SourceVector1,SourceVector2,SourceVector3

⌨️ 快捷键说明

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