📄 watermark.cpp
字号:
for(i=0;i<nNewHeight;i++)
{
for(j=0;j<nNewWidth;j++)
{
for(int q=0;q<3;q++)
{
*(pn3T+3*i*nNewWidth+j*3+q)=*(pnT+i*nNewWidth+j);
}
}
}
}
else if( pDoc->m_nOriBitCount==24 )
{
pn3T=new int[(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth*3];
for(int p=0;p<3;p++)
{
for(x=0;x<nSizePic;x++)
{
*(pnTemp+x)=*(pDoc->pnOriPic+x*3+p);
}
memcpy( pnT,pnTemp , sizeof(int)*nSizePic );
for(i=0;i<nNewHeight;i++)
{
for(j=0;j<nNewWidth;j++)
{
*(pnTemp+i*nNewWidth+j)=*(pnT+i+(nNewWidth-1-j)*nNewHeight);
}
}
for(x=0;x<nSizePic;x++)
{
*(pn3T+x*3+p)=*(pnTemp+x);
}
}
}
free(pnT);
free(pnTemp);
//写入一个新的bmp文件
BF.bfOffBits =54;
BF.bfReserved1 =0;
BF.bfReserved2 =0;
BF.bfSize =int((nNewWidth + 3) / 4) * 4;
BF.bfType =19778;
BI.biBitCount =24;
BI.biClrImportant =0;
BI.biClrUsed =0;
BI.biCompression =0;
BI.biHeight =nNewHeight;
BI.biPlanes =1;
BI.biSize =40;
BI.biSizeImage =0;
BI.biWidth =nNewWidth;
BI.biXPelsPerMeter =0;
BI.biYPelsPerMeter =0;
int nSizeWidth;
nSizeWidth=int((nNewWidth*3+3)/4)*4 ;
lpTemp = (BYTE *)calloc( nSizeWidth *nNewHeight, sizeof( BYTE ));
lpo=lpTemp;
int l;
int *pnTT;
pnTT=pn3T;
for(j=0;j<nNewHeight;j++){
for(i=0;i<nNewWidth ;i++){
for(l=0;l<3;l++){
*lpTemp=(BYTE)*pn3T;
lpTemp=lpTemp+1;
pn3T=pn3T+1;
} //for l
} //for i
if(((nNewWidth*3)%4)!=0){ //加入附加字节
lpTemp=lpTemp+4-((nNewWidth*3)%4);
}
}
pn3T=pnTT;
free(pn3T);
// CFileDialog odlg(FALSE,"bmp","*.bmp"); //显示写入图像的文件
lpTemp=lpo;
// 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, nNewHeight*nSizeWidth );
fOutFile.Close();
// }
free(lpTemp);
// CDib dibTemp;
fOutFile.Open(sFileName,CFile::modeRead);
// fOutFile.Open(odlg.GetPathName(),CFile::modeRead);
pDoc->m_dibOriPic.Read(&fOutFile);
fOutFile.Close();
Invalidate();
}
void CImageVisualView::OnGeoZoom()
{
// TODO: Add your command handler code here
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->m_boolFlag=FALSE;
CDialogGeoZoom dlgGeoZoom;
float fXZoomRatio=0.5,fYZoomRatio=0.5;
dlgGeoZoom.m_fXZoom=fXZoomRatio;
dlgGeoZoom.m_fYZoom=fYZoomRatio;
if(dlgGeoZoom.DoModal()==IDOK)
{
fXZoomRatio=dlgGeoZoom.m_fXZoom;
fYZoomRatio=dlgGeoZoom.m_fYZoom;
}
int i,j,x;
CFile fOutFile;
int *pnTemp,*pnT;
int nSizePic;
int nNewWidth,nNewHeight;
int *pn3T;
BITMAPFILEHEADER BF;
BITMAPINFOHEADER BI;
BYTE *lpTemp; //写入图像数据指针
BYTE *lpo;
int nOldWidth,nOldHeight;
int nOldSizePic;
nOldWidth=pDoc->m_nOriWidth;
nOldHeight=pDoc->m_nOriHeight;
nNewWidth=(int)((float)pDoc->m_nOriWidth*fXZoomRatio+0.5);
nNewHeight=(int)((float)pDoc->m_nOriHeight*fYZoomRatio+0.5);
nSizePic=nNewWidth*nNewHeight;
nOldSizePic=pDoc->m_nOriHeight*pDoc->m_nOriWidth;
pnTemp= new int [(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth];
pnT=new int [(long)nNewHeight*(long)nNewWidth];
if( pDoc->m_nOriBitCount== 8 )
{
memcpy( pnTemp,pDoc->pnOriPic , sizeof(int)*nOldSizePic );
pn3T=new int[(long)nSizePic*3];
for(i=0;i<nNewHeight;i++)
{
for(j=0;j<nNewWidth;j++)
{
*(pnT+i*nNewWidth+j)=*(pnTemp+(int)((float)i/fYZoomRatio)*nOldWidth+(int)((float)j/fXZoomRatio+0.5));
}
}
for(i=0;i<nNewHeight;i++)
{
for(j=0;j<nNewWidth;j++)
{
for(int q=0;q<3;q++)
{
*(pn3T+3*i*nNewWidth+j*3+q)=*(pnT+i*nNewWidth+j);
}
}
}
}
else if( pDoc->m_nOriBitCount==24 )
{
pn3T=new int[(long)nSizePic*3];
for(int p=0;p<3;p++)
{
for(x=0;x<nOldSizePic;x++)
{
*(pnTemp+x)=*(pDoc->pnOriPic+x*3+p);
}
memcpy( pnT,pnTemp , sizeof(int)*nOldSizePic );
for(i=0;i<nNewHeight;i++)
{
for(j=0;j<nNewWidth;j++)
{
*(pnTemp+i*nNewWidth+j)=*(pnT+(int)((float)i/fYZoomRatio+0.5)*nOldWidth+(int)((float)j/fXZoomRatio+0.5));
}
}
for(x=0;x<nSizePic;x++)
{
*(pn3T+x*3+p)=*(pnTemp+x);
}
}
}
free(pnT);
free(pnTemp);
//写入一个新的bmp文件
BF.bfOffBits =54;
BF.bfReserved1 =0;
BF.bfReserved2 =0;
BF.bfSize =int((nNewWidth + 3) / 4) * 4;
BF.bfType =19778;
BI.biBitCount =24;
BI.biClrImportant =0;
BI.biClrUsed =0;
BI.biCompression =0;
BI.biHeight =nNewHeight;
BI.biPlanes =1;
BI.biSize =40;
BI.biSizeImage =0;
BI.biWidth =nNewWidth;
BI.biXPelsPerMeter =0;
BI.biYPelsPerMeter =0;
int nSizeWidth;
nSizeWidth=int((nNewWidth*3+3)/4)*4 ;
lpTemp = (BYTE *)calloc( nSizeWidth *nNewHeight, sizeof( BYTE ));
lpo=lpTemp;
int l;
int *pnTT;
pnTT=pn3T;
for(j=0;j<nNewHeight;j++){
for(i=0;i<nNewWidth ;i++){
for(l=0;l<3;l++){
*lpTemp=(BYTE)*pn3T;
lpTemp=lpTemp+1;
pn3T=pn3T+1;
} //for l
} //for i
if(((nNewWidth*3)%4)!=0){ //加入附加字节
lpTemp=lpTemp+4-((nNewWidth*3)%4);
}
}
pn3T=pnTT;
free(pn3T);
// CFileDialog odlg(FALSE,"bmp","*.bmp"); //显示写入图像的文件
lpTemp=lpo;
// 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, nNewHeight*nSizeWidth );
fOutFile.Close();
// }
free(lpTemp);
// CDib dibTemp;
fOutFile.Open(sFileName,CFile::modeRead);
// fOutFile.Open(odlg.GetPathName(),CFile::modeRead);
pDoc->m_dibOriPic.Read(&fOutFile);
fOutFile.Close();
Invalidate();
}
void CImageVisualView::OnWatermarkPatchwork()
{
// TODO: Add your command handler code here
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDialogWatermarkPatchWork dlgWatermarkPatchWork;
int i,j;
int Seedx=4534,Seedy=5323;
int Nx=3535,Ny=4362;
int nbit=2;
int *pn;
pn=pDoc->pnOriPic;
int *nRecPoint;
nRecPoint=new int[m_nMarkWidth*m_nMarkHeight*2];
dlgWatermarkPatchWork.m_nBit=nbit;
int bit=1;
if(dlgWatermarkPatchWork.DoModal()==IDOK)
{
nbit=dlgWatermarkPatchWork.m_nBit;
}
for(i=0;i<nbit-1;i++)
{
bit=bit*2;
}
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;
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 && m_nMarkBitCount==8)
{
for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
{
Tempw=*(nRecPoint+2*i);
Temph=*(nRecPoint+2*i+1);
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);
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);
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);
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::OnRestoreBlurdib()
{
// TODO: Add your command handler code here
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
long i,j,l;
long lgSizePicture;
int *pn;
BYTE *pb;
lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
int x,y;
int nSumPic;
int nClub=3;
int nClub2;
int i0,j0;
i0=nClub/2;
j0=nClub/2;
nClub2=nClub*nClub;
pb=pDoc->pbOriStatic;
pn=pDoc->pnOriPic;
int *pnTemp;
if( pDoc->m_nOriBitCount== 8 )
{
pnTemp= new int [(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth];
memcpy( pnTemp,pDoc->pnOriPic , sizeof(int)*lgSizePicture);
for(i=i0;i<pDoc->m_nOriHeight-i0;i++)
{
for(j=j0;j<pDoc->m_nOriWidth-j0;j++)
{
nSumPic=0;
for(x=-i0;x<=i0;x++)
{
for(y=-j0;y<=j0;y++)
{
nSumPic=nSumPic+*(pnTemp+(i+x)*pDoc->m_nOriWidth+(j+y));
}
}
*(pn+(i)*pDoc->m_nOriWidth+(j))=(int)((float)nSumPic/(float)nClub2);
}
}
}
else if( pDoc->m_nOriBitCount==24 )
{
pnTemp= new int [(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth*3];
memcpy( pnTemp,pDoc->pnOriPic , sizeof(int)*lgSizePicture*3 );
for(int p=0;p<3;p++)
{
for(i=i0;i<pDoc->m_nOriHeight-i0;i++)
{
for(j=j0;j<pDoc->m_nOriWidth-j0;j++)
{
nSumPic=0;
for(x=-i0;x<=i0;x++)
{
for(y=-j0;y<=j0;y++)
{
nSumPic=nSumPic+*(pnTemp+3*(i+x)*pDoc->m_nOriWidth+3*(j+y)+p);
}
}
*(pn+(i)*pDoc->m_nOriWidth*3+(j)*3+p)=(int)((float)nSumPic/(float)nClub2);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -