📄 watermark.cpp
字号:
free(pnTemp);
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;
Invalidate();
}
void CImageVisualView::OnWatermarkPatchworkDraw()
{
// TODO: Add your command handler code here
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDialogWatermarkPatchWork dlgWatermarkPatchWork;
long i,j;
int nbit=2;
BITMAPFILEHEADER BF;
BITMAPINFOHEADER BI;
dlgWatermarkPatchWork.m_nBit=nbit;
int bit=1;
BYTE *pb;
int *pn;
int Seedx=4534,Seedy=5323;
int Nx=3535,Ny=4362;
int *nRecPoint;
nRecPoint=new int[m_nMarkWidth*m_nMarkHeight*2];
if(dlgWatermarkPatchWork.DoModal()==IDOK)
{
nbit=dlgWatermarkPatchWork.m_nBit;
}
for(i=0;i<nbit-1;i++)
{
bit=bit*2;
}
int nWaterMarkWidth=64,nWaterMarkHeight=64;
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;
BYTE *bDrawWatermark;
bDrawWatermark=new BYTE[nWaterMarkWidth*nWaterMarkHeight];
pb=pDoc->pbOriStatic;
pn=pDoc->pnOriPic;
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 )
{
for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
{
Tempw=*(nRecPoint+2*i);
Temph=*(nRecPoint+2*i+1);
if((*(pn+Temph*w+Tempw)%(2*bit))>=bit)
{
*(bDrawWatermark+i)=255;
}else
*(bDrawWatermark+i)=0;
}
}else if(pDoc->m_nOriBitCount== 24)
{
for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
{
Tempw=*(nRecPoint+2*i);
Temph=*(nRecPoint+2*i+1);
if((*(pn+Temph*w*3+Tempw*3)%(2*bit))>=bit)
{
*(bDrawWatermark+i)=255;
}else
*(bDrawWatermark+i)=0;
}
}
BF.bfOffBits =54;
BF.bfReserved1 =0;
BF.bfReserved2 =0;
BF.bfSize =int((nWaterMarkWidth + 3) / 4) * 4;
BF.bfType =19778;
BI.biBitCount =24;
BI.biClrImportant =0;
BI.biClrUsed =0;
BI.biCompression =0;
BI.biHeight =nWaterMarkHeight;
BI.biPlanes =1;
BI.biSize =40;
BI.biSizeImage =0;
BI.biWidth =nWaterMarkWidth;
BI.biXPelsPerMeter =0;
BI.biYPelsPerMeter =0;
int nSizeWidth;
nSizeWidth=int((nWaterMarkWidth*3+3)/4)*4 ;
BYTE *lpTemp,*lpo,*lpD;
lpTemp = (BYTE *)calloc( nSizeWidth *nWaterMarkHeight, sizeof( BYTE ));
lpo=lpTemp;
lpD=bDrawWatermark;
int l;
for(j=0;j<nWaterMarkHeight;j++){
for(i=0;i<nWaterMarkWidth ;i++){
for(l=0;l<3;l++){
*(lpTemp)=*(bDrawWatermark);
lpTemp=lpTemp+1;
}
bDrawWatermark++; //for l
} //for i
if(((nWaterMarkWidth*3)%4)!=0){ //加入附加字节
lpTemp=lpTemp+4-((nWaterMarkWidth*3)%4);
}
}
bDrawWatermark=lpD;
CFileDialog odlg(FALSE,"bmp","*.bmp"); //显示写入图像的文件
lpTemp=lpo;
CFile fOutFile;
// 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, nWaterMarkHeight*nSizeWidth );
fOutFile.Close();
// }
/* CClientDC dlgDC(this);
for(i=0;i<nWaterMarkHeight;i++)
{
for(j=0;j<nWaterMarkWidth;j++)
{
dlgDC.SetPixel(pDoc->m_nOriWidth+j,nWaterMarkHeight+nWaterMarkHeight-i-1,RGB(*(bDrawWatermark+nWaterMarkWidth*i+j),*(bDrawWatermark+i*nWaterMarkWidth+j),*(bDrawWatermark+i*nWaterMarkWidth+j)));
}
}*/
free(bDrawWatermark);
free(lpTemp);
fOutFile.Open(sFileName,CFile::modeRead);
// fOutFile.Open(odlg.GetPathName(),CFile::modeRead);
m_dibDrawMark.Read(&fOutFile);
fOutFile.Close();
blDrawMark=TRUE;
free(nRecPoint);
Invalidate();
}
void CImageVisualView::OnWatermarkHashOneway()
{
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int i,j;
int Seedx=4534,Seedy=5323,Seedl=3415;
int Nx=3535,Ny=4362,Nl=3551;
int t;
int *pn;
pn=pDoc->pnOriPic;
int *nRecPoint;
nRecPoint=new int[m_nMarkWidth*m_nMarkHeight*3];
int bit=1;
// for(i=0;i<nbit-1;i++)
// {
// bit=bit*2;
// }
int Lx,Ly,Ll;
int w,h,L;
w=pDoc->m_nOriWidth;
h=pDoc->m_nOriHeight;
L=8;
Lx=(Seedx*Seedx)%Nx;
Ly=(Seedy*Seedy)%Ny;
Ll=(Seedl*Seedl)%Nl;
*(nRecPoint)=(Lx%w);
*(nRecPoint+1)=(Ly%h);
*(nRecPoint+2)=(Ll%L);
int Tempw,Temph,TempL;
BOOL blFlag;
int count=1;
while(count<m_nMarkWidth*m_nMarkHeight)
{
blFlag=TRUE;
Lx=(Lx*Lx)%Nx;
Ly=(Ly*Ly)%Ny;
Ll=(Ll*Ll)%Nl;
Tempw=(Lx%w);
Temph=(Ly%h);
TempL=(Ll%L);
if(TempL==0||TempL==7)
{
blFlag=FALSE;
}
for(j=0;j<count;j++)
{
if((Tempw==*(nRecPoint+2*j))&&(Temph==*(nRecPoint+2*j+1)))
{
blFlag=FALSE;
}
Lx=Lx+1;
Ly=Ly+2;
Ll=Ll+Lx-Ly;
}
if(blFlag)
{
*(nRecPoint+2*count)=Tempw;
*(nRecPoint+2*count+1)=Temph;
*(nRecPoint+2*count+2)=TempL;
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);
TempL=*(nRecPoint+2*count+2);
for(t=0;t<TempL;t++)
{
bit=bit*2;
}
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);
TempL=*(nRecPoint+2*count+2);
for(t=0;t<TempL;t++)
{
bit=bit*2;
}
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);
TempL=*(nRecPoint+2*count+2);
for(t=0;t<TempL;t++)
{
bit=bit*2;
}
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);
TempL=*(nRecPoint+2*count+2);
for(t=0;t<TempL;t++)
{
bit=bit*2;
}
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::OnWatermarkDrawHash()
{
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int i,j;
int nWaterMarkWidth=64,nWaterMarkHeight=64;
BITMAPFILEHEADER BF;
BITMAPINFOHEADER BI;
int Seedx=4534,Seedy=5323,Seedl=3415;
int Nx=3535,Ny=4362,Nl=3551;
int t;
int *pn;
pn=pDoc->pnOriPic;
int *nRecPoint;
nRecPoint=new int[nWaterMarkWidth*nWaterMarkHeight*3];
int bit=1;
// for(i=0;i<nbit-1;i++)
// {
// bit=bit*2;
// }
BYTE *bDrawWatermark;
bDrawWatermark=new BYTE[nWaterMarkWidth*nWaterMarkHeight];
int Lx,Ly,Ll;
int w,h,L;
w=pDoc->m_nOriWidth;
h=pDoc->m_nOriHeight;
L=8;
Lx=(Seedx*Seedx)%Nx;
Ly=(Seedy*Seedy)%Ny;
Ll=(Seedl*Seedl)%Nl;
*(nRecPoint)=(Lx%w);
*(nRecPoint+1)=(Ly%h);
*(nRecPoint+2)=(Ll%L);
int Tempw,Temph,TempL;
BOOL blFlag;
int count=1;
BYTE *pb;
pb=pDoc->pbOriStatic;
pn=pDoc->pnOriPic;
while(count<nWaterMarkWidth*nWaterMarkHeight)
{
blFlag=TRUE;
Lx=(Lx*Lx)%Nx;
Ly=(Ly*Ly)%Ny;
Ll=(Ll*Ll)%Nl;
Tempw=(Lx%w);
Temph=(Ly%h);
TempL=(Ll%L);
if(TempL==0||TempL==7)
{
blFlag=FALSE;
}
for(j=0;j<count;j++)
{
if((Tempw==*(nRecPoint+2*j))&&(Temph==*(nRecPoint+2*j+1)))
{
blFlag=FALSE;
}
Lx=Lx+1;
Ly=Ly+2;
Ll=Ll+Lx-Ly;
}
if(blFlag)
{
*(nRecPoint+2*count)=Tempw;
*(nRecPoint+2*count+1)=Temph;
*(nRecPoint+2*count+2)=TempL;
count++;
}
}
if(pDoc->m_nOriBitCount== 8 )
{
for(i=0;i<nWaterMar
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -