📄 multimark.cpp
字号:
{
for(x=0;x<8;x++)
{
for(y=0;y<8;y++)
{
T[y][x]=0;
}
}
for(x=0;x<4;x++)
{
for(y=0;y<4;y++)
{
T[y][x]=nRemain[j][i][y][x];
}
}
//**********************************
//**********************************
Dct.FloatIDCT(T);
for(x=0;x<8;x++)
{
for(y=0;y<8;y++)
{
*(pnCover+(i*8+x)*64+j*8+y)=(int)T[y][x];
}
}
}
}
}
//*****************************************************
//*****************************************************
//**********测试
if(pDoc->m_nBitCount==8)
{
for(i=0;i<m_nMarkHeight;i++)
{
for(j=0;j<m_nMarkWidth;j++)
{
*(pn+(i+nPointy)*pDoc->m_nWidth+(nPointx+j))=*(pnCover+i*64+j);
}
}
}
else if(pDoc->m_nBitCount==24)
{
for(i=0;i<m_nMarkHeight;i++)
{
for(j=0;j<m_nMarkWidth;j++)
{
*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j))=*(pnCover+3*i*64+3*j);
*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j)+1)=*(pnCover+3*i*64+3*j+1);
*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j)+2)=*(pnCover+3*i*64+3*j+2);
}
}
}
//*************************************************************
//*************************************************************
if(pDoc->m_nBitCount==24)
{
for(j=0;j<pDoc->m_nHeight;j++){
for(i=0;i<pDoc->m_nWidth ;i++){
for(l=0;l<3;l++){
*pDoc->m_Dib.m_lpImage=(BYTE)*pDoc->m_pnPic;
pDoc->m_pnPic=pDoc->m_pnPic+1;
pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+1;
} //for l
} //for i
if(((pDoc->m_nWidth*3)%4)!=0){ //加入附加字节
pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+4-((pDoc->m_nWidth*3)%4);
}
}
}else if(pDoc->m_nBitCount==8)
{
for(j=0;j<pDoc->m_nHeight;j++){
for(i=0;i<pDoc->m_nWidth ;i++){
*pDoc->m_Dib.m_lpImage=(BYTE)*pDoc->m_pnPic;
pDoc->m_pnPic=pDoc->m_pnPic+1;
pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+1;
} //for i
if(((pDoc->m_nWidth)%4)!=0){ //加入附加字节
pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+4-((pDoc->m_nWidth)%4);
}
}
}
pDoc->m_Dib.m_lpImage=pb;
pDoc->m_pnPic=pn;
int nSizeWidth=(nMarkWidth*3+3)/4*4;
BITMAPFILEHEADER BF;
BITMAPINFOHEADER BI;
BF.bfOffBits =54;
BF.bfReserved1 =0;
BF.bfReserved2 =0;
BF.bfSize =int((nMarkWidth*3 + 3) / 4) * 4;
BF.bfType =19778;
BI.biBitCount =24;
BI.biClrImportant =0;
BI.biClrUsed =0;
BI.biCompression =0;
BI.biHeight =nMarkHeight;
BI.biPlanes =1;
BI.biSize =40;
BI.biSizeImage =0;
BI.biWidth =nMarkWidth;
BI.biXPelsPerMeter =0;
BI.biYPelsPerMeter =0;
CString sFileName="c:\\temp.bmp";
fOutFile.Open (sFileName,CFile::modeCreate | CFile::modeWrite );
fOutFile.Write((LPVOID) &BF, sizeof(BITMAPFILEHEADER));
fOutFile.Write((LPVOID) &BI, sizeof(BITMAPINFOHEADER));
fOutFile.Write ((LPVOID) pbMarkDraw, nMarkHeight*nSizeWidth );
fOutFile.Close();
free(pbMarkDraw);
fOutFile.Open(sFileName,CFile::modeRead);
m_dibDrawMark.Read(&fOutFile);
fOutFile.Close();
Invalidate();
}
void CMultiMarkView::OnMWeakRuban()
{
CMultiMarkDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int *pnI;
long i,temp,j,l;
long lgSizePicture;
int *pn;
BYTE *pb;
pb=pDoc->m_Dib.m_lpImage;
pn=pDoc->m_pnPic;
int xBlock=8,yBlock=8;
int nMW,nMH;
int nW,nH;
int nMarkTemp; //水印数据临时变量
nMW=m_nMarkWidth;
nMH=m_nMarkHeight;
nW=pDoc->m_nWidth;
nH=pDoc->m_nHeight;
BYTE *pbDrawR,*pbDrawW;
pbDrawR=new BYTE[64*64];
pbDrawW=new BYTE[64*64];
// int nPointR[64][64][2];
long lN=13453,lS=3241;
int x,y;
if(nMW!=64 || nMH!=64)
{
MessageBox("仅对64*64的二值水印成立");
return;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++产生随机序列
for(i=0;i<64;i++)
{
for(j=0;j<64;j++)
{
for(x=0;x<2;x++)
{
lS=(lS*lS+4*lS+1)%lN;
nPointR[j][i][x]=(int)lS%8;
}
}
}
//**************************************************************************
//**************************************************************************
//融合图像进行整数小波变换,将DCT系数嵌入到中间
lgSizePicture=(long)pDoc->m_nHeight*(long)pDoc->m_nWidth;
pnI= new int [(long)pDoc->m_nHeight*(long)pDoc->m_nWidth];
if( pDoc->m_nBitCount== 8 )
{
for( i = 0; i < lgSizePicture; i++ )
*( pnI + i) = (*( pDoc->m_pnPic+i)-128);
m_IntWT.IntWT_2D( pnI, pDoc->m_nHeight, pDoc->m_nWidth, 1, 1 );
//++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++
//+++++信息隐藏
for(i=0;i<nMH;i++)
{
for(j=0;j<nMW;j++)
{
if(m_pnMark[3*i*nMW+j*3]>128)
{
nMarkTemp=0;
}else
nMarkTemp=1;
for(x=0;x<8;x++)
{
for(y=0;y<8;y++)
{
if(x==nPointR[j][i][0] && y==nPointR[j][i][1])
{
if(pnI[(8*i+x)*nW+8*j+y]>=0)
{
pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/16*16+8*nMarkTemp;
}else
pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/16*16-8*nMarkTemp;
}else
{
if(pnI[(8*i+x)*nW+8*j+y]>=0)
{
pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/2*2+1*nMarkTemp;
}else
pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/2*2-1*nMarkTemp;
}
}
}
}
}
//信息提取测试
for(i=0;i<nMH;i++)
{
for(j=0;j<nMW;j++)
{
//if(pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16<8 && pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16>(-8))
if(pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16==0)
{
pbDrawR[i*nMW+j]=255;
}else
pbDrawR[i*nMW+j]=0;
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++
m_IntWT.IntWT_2D_I( pnI, pDoc->m_nHeight, pDoc->m_nWidth, 1, 1 );
for(i=0;i<lgSizePicture;i++)
{
if((*(pnI+i)+128)<0)
{
temp=0;
}
else if((*(pnI+i)+128)>255)
{
temp=255;
}
else
temp=(int)(*(pnI+i)+128);
*(pnI+i)=temp;
}
memcpy( pDoc->m_pnPic, pnI, sizeof(int)*lgSizePicture );
}
else if( pDoc->m_nBitCount==24 )
{
for(int p=0;p<3;p++)
{
for( i = 0; i < lgSizePicture; i++ )
*( pnI + i) = (*( pDoc->m_pnPic+3*i+p)-128);
m_IntWT.IntWT_2D( pnI, pDoc->m_nHeight, pDoc->m_nWidth, 1, 1 );
m_IntWT.IntWT_2D_I( pnI, pDoc->m_nHeight, pDoc->m_nWidth, 1, 1 );
for(i=0;i<lgSizePicture;i++)
{
if((*(pnI+i)+128)<0)
{
temp=0;
}
else if((*(pnI+i)+128)>255)
{
temp=255;
}
else
temp=(int)(*(pnI+i)+128);
*(pnI+i)=temp;
}
for( i = 0; i < lgSizePicture; i++ )
*( pDoc->m_pnPic+3*i+p)= (*( pnI + i));
}
}
delete[] pnI;
//*****************************************************
//*****************************************************
//**********测试
/* if(pDoc->m_nOriBitCount==8)
{
for(i=0;i<m_nMarkHeight;i++)
{
for(j=0;j<m_nMarkWidth;j++)
{
*(pn+(i+nPointy)*pDoc->m_nWidth+(nPointx+j))=*(pnCover+i*m_nMarkWidth+j);
}
}
}
else if(pDoc->m_nOriBitCount==24)
{
for(i=0;i<m_nMarkHeight;i++)
{
for(j=0;j<m_nMarkWidth;j++)
{
*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j))=*(pnCover+3*i*m_nMarkWidth+3*j);
*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j)+1)=*(pnCover+3*i*m_nMarkWidth+3*j+1);
*(pn+3*(i+nPointy)*pDoc->m_nWidth+3*(nPointx+j)+2)=*(pnCover+3*i*m_nMarkWidth+3*j+2);
}
}
}*/
//*************************************************************
//*************************************************************
if(pDoc->m_nBitCount==24)
{
for(j=0;j<pDoc->m_nHeight;j++){
for(i=0;i<pDoc->m_nWidth ;i++){
for(l=0;l<3;l++){
*pDoc->m_Dib.m_lpImage=(BYTE)*pDoc->m_pnPic;
pDoc->m_pnPic=pDoc->m_pnPic+1;
pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+1;
} //for l
} //for i
if(((pDoc->m_nWidth*3)%4)!=0){ //加入附加字节
pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+4-((pDoc->m_nWidth*3)%4);
}
}
}else if(pDoc->m_nBitCount==8)
{
for(j=0;j<pDoc->m_nHeight;j++){
for(i=0;i<pDoc->m_nWidth ;i++){
*pDoc->m_Dib.m_lpImage=(BYTE)*pDoc->m_pnPic;
pDoc->m_pnPic=pDoc->m_pnPic+1;
pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+1;
} //for i
if(((pDoc->m_nWidth)%4)!=0){ //加入附加字节
pDoc->m_Dib.m_lpImage=pDoc->m_Dib.m_lpImage+4-((pDoc->m_nWidth)%4);
}
}
}
pDoc->m_Dib.m_lpImage=pb;
pDoc->m_pnPic=pn;
for(i=0;i<64*64;i++)
{
for(j=0;j<3;j++)
{
m_dibMark.m_lpImage[i*3+j]=pbDrawR[i];
}
}
Invalidate();
}
void CMultiMarkView::OnMWeakRubanDraw()
{
CMultiMarkDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int *pnI;
long i,j;
long lgSizePicture;
int *pn;
BYTE *pb;
pb=pDoc->m_Dib.m_lpImage;
pn=pDoc->m_pnPic;
int xBlock=8,yBlock=8;
int nMW,nMH;
int nW,nH;
// int nMarkTemp; //水印数据临时变量
nMW=64;
nMH=64;
nW=pDoc->m_nWidth;
nH=pDoc->m_nHeight;
// int nPointR[64][64][2];
long lN=13453,lS=3241;
int x,y;
BYTE *pbDrawR,*pbDrawW;
pbDrawR=new BYTE[64*64];
pbDrawW=new BYTE[64*64];
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++产生随机序列
/* for(i=0;i<64;i++)
{
for(j=0;j<64;j++)
{
for(x=0;x<2;x++)
{
lS=(lS*lS+4*lS+1)%lN;
nPointR[j][i][x]=(int)lS%8;
}
}
}*/
//在8*8的方块中随机选取图像数据嵌入的位置,将图像分成64*64个8*8的数据块
for(i=0;i<64;i++)
{
for(j=0;j<64;j++)
{
for(x=0;x<2;x++)
{
lS=(lS*lS+4*lS+1)%lN;
nPointR[j][i][x]=(int)lS%8;
}
}
}
//**************************************************************************
//**************************************************************************
lgSizePicture=(long)pDoc->m_nHeight*(long)pDoc->m_nWidth;
pnI= new int[(long)pDoc->m_nHeight*(long)pDoc->m_nWidth];
if( pDoc->m_nBitCount== 8 )
{
for( i = 0; i < lgSizePicture; i++ )
*( pnI + i) = (*( pDoc->m_pnPic+i)-128);
m_IntWT.IntWT_2D( pnI, pDoc->m_nHeight, pDoc->m_nWidth, 1, 1 );
//++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++
//+++++信息提取
for(i=0;i<nMH;i++)
{
for(j=0;j<nMW;j++)
{
//if(pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16<8 && pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16>(-8))
if(pnI[(8*i+nPointR[j][i][0])*nW+8*j+nPointR[j][i][1]]%16==0)
{
pbDrawR[i*nMW+j]=255;
}else
pbDrawR[i*nMW+j]=0;
for(x=0;x<8;x++)
{
for(y=0;y<8;y++)
{
if(x!=nPointR[j][i][0] || y!=nPointR[j][i][1])
{
if(pnI[(8*i+x)*nW+8*j+y]%2==0)
{
pbDrawW[i*nMW+j]=255;
}else
pbDrawW[i*nMW+j]=0;
}
}
}
}
}
}
/*
for(i=0;i<nMH;i++)
{
for(j=0;j<nMW;j++)
{
if(m_pnMark[i*nMW+j]>128)
{
nMarkTemp=0;
}else
nMarkTemp=1;
for(x=0;x<8;x++)
{
for(y=0;y<8;y++)
{
if(x==nPointR[j][i][0] && y==nPointR[j][i][1])
{
if(pnI[(8*i+x)*nW+8*j+y]>=0)
{
pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/16*16+8*nMarkTemp;
}else
pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/16*16-8*nMarkTemp;
}else
{
if(pnI[(8*i+x)*nW+8*j+y]>=0)
{
pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/2*2+1*nMarkTemp;
}else
pnI[(8*i+x)*nW+8*j+y]=pnI[(8*i+x)*nW+8*j+y]/2*2-1*nMarkTemp;
}
}
}
*/
for(i=0;i<64*64;i++)
{
for(j=0;j<3;j++)
{
m_dibMark.m_lpImage[i*3+j]=pbDrawW[i];
}
}
delete[] pnI;
Invalidate();
}
void CMultiMarkView::BlockValue(int *pnX)
{
long i,j;
int k;
int nTW=512;
int nLevel=4;
int nCount=0;
//这里嵌入水印信息的系数不包括LL层系数
int nLay=1;
for(i=0;i<512;i++) //将线性一维数组转化为二维数组
{
for(j=0;j<512;j++)
{
nTemp[i][j]=pnX[i*512+j];
}
}
nTW=nTW>>nLevel; //计算最底层块的数据宽度
for(k=0;k<2;k++) //将需要扫描排序的块数据读取出来
{ //需要读取两层数据
for(i=0;i<nTW;i++)
{
for(j=nTW;j<2*nTW;j++) //读取LH层信息
{
nIn[nCount][0]=i;
nIn[nCount][1]=j;
nIn[nCount][2]=nLay;
nIn[nCount][3]=nTemp[i][j];
nCount++;
}
}
nLay++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -