📄 dctwaterview.cpp
字号:
////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 + -